【问题标题】:merge rows with conditional in if statement在 if 语句中将行与条件合并
【发布时间】:2017-11-08 17:24:19
【问题描述】:

我有一个看起来像这样的数据框:

df <- data.frame ("ID"=c(a, b, c, c, d, e, e), "K"= c(1, 1, 1, 1, 1, 1, 1), 
                       "P"=c(1, 1, 1, 1, 2, 2, 1), "C"=c(1, 2, 1, 2, 1, 2, 1))
  ID K P C
   a 1 1 1
   b 1 1 2
   c 1 1 1
   c 1 1 2
   d 1 2 1
   e 1 2 2
   e 1 1 1

我正在尝试折叠具有相同 ID 值的行。

对于没有重复 ID 值的行,我希望该行保持不变。

对于具有重复 ID 值 (c & e) 的行,我希望它折叠行。对于每一列(K、P、C),我希望它查看每个重复行的值。如果 K 列中的两个值 = 1,则输出应保持为 1。如果 K 列中的两个值都不等于 1,则输出应为 -99。 P 列和 C 列相同。

所以理想的输出应该是这样的:

  ID K  P   C
1  a 1  1   1
2  b 1  1   2
3  c 1  1  -99
5  d 1  2   1
6  e 1 -99 -99

到目前为止,我只知道:

for (row in 1:nrow(df) ) {
  if length(df$ID) >=2



 }

但我很困惑,因为我什至不知道这是否是正确的开始方式。

谢谢!

【问题讨论】:

  • 标准也不是很清楚(至少对我来说),您能否详细解释一下??

标签: r merge conditional rows


【解决方案1】:

plyr 包在这里很有用。

 原始版本

df <- data.frame ("ID"=c(1, 2, 3, 3, 4, 5, 5), "K"= c(1, 1, 1, 1, 1, 1, 1), 
                  "P"=c(1, 1, 1, 1, 2, 2, 1), "C"=c(1, 2, 1, 2, 1, 2, 1))
library(plyr)
ddply(df, .variables = .(ID),
      summarize,
      K = if (length(K) == 1) K else if (all(K == 1)) 1 else -99,
      P = if (length(P) == 1) P else if (all(P == 1)) 1 else -99,
      C = if (length(C) == 1) C else if (all(C == 1)) 1 else -99)

 保留附加列的版本

请注意,此代码假定您的附加列对于具有相同 ID 的所有行具有相同的值。

df <- data.frame ("ID"=c(1, 2, 3, 3, 4, 5, 5), "K"= c(1, 1, 1, 1, 1, 1, 1), 
                  "P"=c(1, 1, 1, 1, 2, 2, 1), "C"=c(1, 2, 1, 2, 1, 2, 1),
                  "extra1" = c("a", "b", "c", "c", "d", "e", "e"),
                  "extra2" = c("A", "B", "C", "C", "D", "E", "E"))
library(plyr)
df1 <- ddply(df, .variables = .(ID),
             summarize,
             K = if (length(K) == 1) K else if (all(K == 1)) 1 else -99,
             P = if (length(P) == 1) P else if (all(P == 1)) 1 else -99,
             C = if (length(C) == 1) C else if (all(C == 1)) 1 else -99)
df2 <- merge(df1, unique(df[, setdiff(names(df), c("K", "P", "C"))]),
             by = "ID")

【讨论】:

  • 这很好用!非常感谢!只是一个快速的问题。有没有学习 plyr 包的好工具?它似乎非常有用。
  • 实际上是另一个问题,似乎当我在我的数据中运行它时,它并没有保留其他未触及的列。在我的数据中,我有 6 个其他列,每行都有其他信息,但我不知道如何保留这些列?
  • 不知道任何 plyr 材料,对不起!不过,谷歌上有很多,例如seananderson.ca/courses/12-plyr/plyr_2012.pdf.
【解决方案2】:

这是使用 baseR 的另一种方法:

df <- data.frame ("ID"=c(1, 2, 3, 3, 4, 5, 5), "K"= c(1, 1, 1, 1, 1, 1, 1), 
                  "P"=c(1, 1, 1, 1, 2, 2, 1), "C"=c(1, 2, 1, 2, 1, 2, 1))

dupl = with(df, duplicated(ID, K, P))
df$c = with(df, ifelse(dupl == TRUE & K == 1, -99, C)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-11-14
    • 1970-01-01
    • 2017-10-29
    • 2018-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多