首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >R-对另一列中有缺失值的不规则熔化数据帧逐个进行整形

R-对另一列中有缺失值的不规则熔化数据帧逐个进行整形
EN

Stack Overflow用户
提问于 2020-01-23 21:29:28
回答 2查看 41关注 0票数 1

我有一个大数据帧,它被分组(例如data中的列组)到同时发生的测量中。值(列值)由4个不同的装置(柱装置)测量,但不一定同时测量所有4个装置。我的数据如下所示

代码语言:javascript
运行
复制
    group device value value.to.be.averaged
1     1      a    69                  173
2     1      b    75                  172
3     2      a    78                  173
4     2      c    69                  172
5     2      b    60                  173
6     2      d    62                  172
7     3      a    80                  173
8     3      c    63                  173
9     3      b    63                  172

它可以通过以下方式重现

代码语言:javascript
运行
复制
my_data<-data.frame(group=c(rep(1:3, c(2,4,3))), 
           device=c("a", "b", "a", "c", "b", "d", "a", "c", "b") , 
           value=sample(60:80,9,replace=T), value.to.be.averaged=sample(172:173,9,replace=T))

我需要将设备放入列中,将组编号作为行id,并将每个精确的测量值分配给设备,如果组中缺少设备,则分配NA。还有其他变量可以简单地求平均。之后,数据应该是这样的。

代码语言:javascript
运行
复制
   group a  b c  d value.to.be.averaged
1     1 77 68 NA NA      172
2     2 60 73 70 76      173
3     3 65 76 77 NA      172

它可以通过以下方式重现

代码语言:javascript
运行
复制
my_reshaped_data<-data.frame(group=c(1:3), a=c(77, 60, 65), b=c(68,73,76), c=c(NA, 70,77), d=c(NA, 76, NA), value.to.be.averaged=c(mean(172,173,173), 
                                                                                                             mean(rep(173,3)), mean(172,172,173)))

由于我的数据是hughe,所以计算时间和计算资源是一个问题。我发现了一些均匀分组的示例,但没有不规则分组的示例。有什么建议吗?干杯,詹尼斯

EN

回答 2

Stack Overflow用户

发布于 2020-01-23 21:34:54

您可以使用tidyverse将数据从长格式转换为宽格式。当设备未用于该组时,它会自动将NA合并到列中

代码语言:javascript
运行
复制
my_data %>%
  group_by(group) %>%
  mutate(average.values = mean(value.to.be.averaged)) %>%
  select(-value.to.be.averaged) %>%
  ungroup() %>%
  pivot_wider(., names_from = device, values_from = value)
票数 1
EN

Stack Overflow用户

发布于 2020-01-24 03:23:43

这是一个使用data.tabledcast的解决方案

代码语言:javascript
运行
复制
 library(data.table)
 setDT(df)[, value.to.be.averaged := round(mean(value.to.be.averaged)), by = group]
 dcast(df, group + value.to.be.averaged ~ device)

 #     group value.to.be.averaged  a  b  c  d
 #1:     1                  172   69 75 NA NA
 #2:     2                  172   78 60 69 62
 #3:     3                  173   80 63 63 NA

数据

代码语言:javascript
运行
复制
df <- structure(list(group = c(1L, 1L, 2L, 2L, 2L, 2L, 3L, 3L, 3L), device = structure(c(1L, 2L, 1L, 3L, 2L, 4L, 1L, 3L, 2L), .Label = c("a","b", "c", "d"), class = "factor"), value = c(69L, 75L, 78L,69L, 60L, 62L, 80L, 63L, 63L), value.to.be.averaged = c(173L, 172L, 173L, 172L, 173L, 172L, 173L, 173L, 172L)), class = "data.frame", row.names = c("1", "2", "3", "4", "5", "6", "7", "8", "9"))
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59879740

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档