【问题标题】:Randomly Select a Value from One Row when Merging Rows合并行时从一行中随机选择一个值
【发布时间】:2018-07-23 19:42:15
【问题描述】:

我想合并以下数据框中的行,以便每个 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 行 var 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

【问题讨论】:

  • 您想对其他变量值求和吗?还是随便拿一个?
  • 当有两个值时随机取一个。当只有一个值时,取那个值。不重复的行不会改变。
  • df2

标签: r


【解决方案1】:
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")

【讨论】:

  • 此解决方案似乎无法始终如一地工作。我会更新问题
【解决方案2】:

你可以这样使用:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-05-08
    • 1970-01-01
    • 2018-03-04
    • 1970-01-01
    • 2020-09-23
    • 1970-01-01
    • 2012-02-21
    相关资源
    最近更新 更多