合并行时

时间:2018-02-13 12:23:51

标签: r

我想合并以下数据框中的行,以便每个var1只有一个:

df1 <- data.frame(var1=c('a', 'a','b','c'), var2=c(1,2,3, 4), var3=c(2, NA, NA, 4), var4=c(4, 3, 2, 1))

  var1 var2 var3 var4
1    a    1    2    4
2    a    2   NA    3
3    b    3   NA    2
4    c    4    4    1

大多数建议似乎是使用这样的东西:

df2 <- ddply(df1,"var1",fun = sum())

或者group_by可能是另一种解决方案。

不幸的是,我必须遵循两条规则:

1)如果重复行有一个NA和一个数字,那么保留数字;

2)如果重复行有两个数字,则随机选择一个数字保留。

所以结果数据看起来应该是这样的:

  var1 var2 var3 var4
1    a    2    2    4
2    b    3   NA    2
3    c    4    4    1

其中第1行var2可以是1或2,第1行第4版可以是3或4。

编辑:

Prem的解决方案有时会起作用,但并非总是如此。我不理解代码的机制来解释为什么它总是不起作用但是如果你运行以下几个例子,那么当需要有一个值时你最终得到一个NA结果:

df1 <- data.frame(var1=c('a', 'a','a','c', 'c'), var2=c(1,2,3,4,NA), var3=c(2, NA, NA, NA,5), var4=c(4, 3, 2, NA,1))


library(dplyr)

#set.seed(1)   #comment this to have random sample

df1 %>%
  group_by(var1) %>%
  fill(var2:var4, .direction = "down") %>%
  sample_n(1)


  var1 var2 var3 var4
1    a    1    2    4
2    a    2   NA    3
3    a    3   NA    2
4    c    4   NA   NA
5    c   NA    5    1

我经常得到以下正确的内容:

    var1  var2  var3  var4
  <fctr> <dbl> <dbl> <dbl>
1      a     3     2     2
2      c     4     5     1

但我有时会得到以下不正确的内容:

    var1  var2  var3  var4
  <fctr> <dbl> <dbl> <dbl>
1      a     3     2     2
2      c     4    NA    NA

2 个答案:

答案 0 :(得分:0)

您可以使用以下内容:

df2 <- subset(df1,!duplicated(var1))

<强>输出

df2
  var1 var2 var3 var4
1    a    1    2    4
3    b    3   NA    2
4    c    4    4    1

答案 1 :(得分:0)

希望这有帮助!

library(dplyr)
set.seed(1)   #comment this to have random sample

df1 %>%
  group_by(var1) %>%
  fill(var2:var4, .direction = "down") %>%
  fill(var2:var4, .direction = "up") %>%
  sample_n(1)

输出:

  var1   var2  var3  var4
1 a      1.00  2.00  4.00
2 b      3.00 NA     2.00
3 c      4.00  4.00  1.00

示例数据:

df1 <- structure(list(var1 = structure(c(1L, 1L, 2L, 3L), .Label = c("a", 
"b", "c"), class = "factor"), var2 = c(1, 2, 3, 4), var3 = c(2, 
NA, NA, 4), var4 = c(4, 3, 2, 1)), .Names = c("var1", "var2", 
"var3", "var4"), row.names = c(NA, -4L), class = "data.frame")