合并两行,其中一些在R中具有缺失值

时间:2016-11-26 15:52:24

标签: r rows collapse na

我想问R社区如何合并具有相同ID的两行(即同一参与者),其中一些变量是相同的,而其他变量是NA' s。在我的例子中,我希望所有值4-5-6出现在一行上,因此NA(或空单元格)就会消失。

This is an example of what my data looks like

我尝试过使用dplyr但没有太大的成功,我必须手动合并(这非常耗时并且增加了出错的风险)。提前感谢您对此问题的帮助!

4 个答案:

答案 0 :(得分:2)

1)使用下面的注释中定义的DF,尝试使用下面定义的compress函数进行聚合。此函数删除NA值并附加NA,以防所有值都被删除,然后取出剩余的第一个值。没有包使用。

compress <- function(x) c(na.omit(x), NA)[1]
aggregate(DF[5:7], DF[1:4], compress)

,并提供:

  ID Value1 Value2 Value3 Value4 Value5 Value6
1  1      A      B      C      x      x      x
2  2      A      B      C      x      x      x

2)如果没有参与者在任何列中包含所有NA值,则更简单的替代方法是我们可以删除compress的定义并使用max na.rm = TRUE而不是这样:

aggregate(DF[5:7], DF[1:4], max, na.rm = TRUE)

注意:可重复输入的输入:

Lines <- "ID Value1 Value2 Value3 Value4 Value5 Value6
1 A B C x x NA
1 A B C NA NA x
2 A B C NA x NA
2 A B C x NA x"
DF <- read.table(text = Lines, header = TRUE, as.is = TRUE)

答案 1 :(得分:2)

# Create sample data frame.
id <- c(rep('Participant 1', 2), rep('Participant 2', 2))
value1 <- rep('A', 4)
value2 <- rep('B', 4)
value3 <- rep('C', 4)
value4 <- c('x', NA, NA, 'x')
value5 <- c('x', NA, 'x', NA)
value6 <- c(NA, 'x', NA, 'x')

df <- data.frame(id, value1, value2, value3, value4, value5, value6, stringsAsFactors = F)

# Use dplyr to group the data and keep the non-NA value from the other columns.
df %>% group_by(id, value1, value2, value3) %>%
       summarise(value4 = max(value4, na.rm = T),
                 value5 = max(value5, na.rm = T),
                 value6 = max(value6, na.rm = T))

答案 2 :(得分:1)

dplyrtidyr的另一种解决方案:

library(dplyr)
library(tidyr)
DF %>% 
  gather(var, val, Value4:Value6) %>% 
  filter(!is.na(val)) %>% 
  spread(var, val)

使用@ G.Grothendieck的数据,结果如下:

  ID Value1 Value2 Value3 Value4 Value5 Value6
1  1      A      B      C      x      x      x
2  2      A      B      C      x      x      x

使用@ {Grothendieck的summarise_each方法max的另一种变体:

DF %>% 
  group_by(ID, Value1, Value2, Value3) %>%
  summarise_each(funs(max(., na.rm = TRUE)))

gatherspread选项也可以转换为reshape2的解决方案:

library(reshape2)
dcast(na.omit(melt(DF, id.vars = c('ID','Value1','Value2','Value3'))),
      ID + Value1 + Value2 + Value3 ~ variable,
      value.var = 'value')

答案 3 :(得分:0)

如果您更喜欢使用library(dplyr) DF %>% group_by(ID, Value1, Value2, Value3) %>% summarise_each(funs(toString(na.omit(.)))) ,请尝试:

     ID Value1 Value2 Value3 Value4 Value5 Value6
  <int>  <chr>  <chr>  <chr>  <chr>  <chr>  <chr>
1     1      A      B      C      x      x      x
2     2      A      B      C      x      x      x

<强>结果:

DF

注意: