【问题标题】:Compare multiple columns and create new ones in R比较多列并在 R 中创建新列
【发布时间】:2020-05-15 07:32:06
【问题描述】:

我在重复的开始 (A) 和结束 (B) 处有一个大的测量数据数据集。现在我想将我的数据行排序为“出现在最后”(出现)和“仍然存在”(现在)并将数据传递到新列中。

data<-data.frame(A1=c(1,2,4),
   A2=c(3,5,4),
   B1=c(10,0,5),
   B2=c(1,0,1))

期望的输出:

data_res<-data.frame(A1=c(1,2,4,0),
                 A2=c(3,5,4,0),
                 B1=c(10,0,5,1),
                 B2=c(1,0,1,2),
                 appeared1=c(0,0,0,1),
                 appeared2=c(0,0,0,2),
                 present1=c(10,0,5,0),
                 present2=c(1,0,1,0))

如您所见,如果数据最后出现,我希望 B 的输出在多列中,如果不是零则应传递。如果数据仍然存在,我也需要 B 的输出,如果不是零的话。 感谢您的帮助!

【问题讨论】:

  • 当数据进入appeared1appeared2present1present2 相比时?为什么第二行的所有值都是 0?
  • 我猜从appear1到present2的最后一行应该是0,0,1,2,而不是1,2,0,0,对吗?或者你的输出的逻辑是什么?
  • 现在和出现是两个不同的东西。如果它在开始时存在,则它没有出现,因此 Appear 得到 0。A2 与 B2 比较得到 0,0,0,2,因为只有最后一行在开始时不存在。正如我所说的,A 是星,B 是终点,它们都有复制品。
  • 您能否在示例数据集中再包含几列以及预期的输出是什么样的?

标签: r compare multiple-columns dplyr


【解决方案1】:

您可以使用dplyr

library(dplyr)
data<-data.frame(A1=c(1,2,4,0),
                 A2=c(3,5,4,0),
                 B1=c(10,0,5,1),
                 B2=c(1,0,1,2))

out<- mutate(data, appeared1 = if_else(A1 == 0, if_else(B1 != 0, B1, 0), 0))
out<- mutate(out, appeared2 = if_else(A2 == 0, if_else(B2 != 0, B2, 0), 0))
out<- mutate(out, present1 = if_else(A1 != 0, if_else(B1 != 0, B1, 0), 0))
out<- mutate(out, present2 = if_else(A2 != 0, if_else(B2 != 0, B2, 0), 0))

输出:

> out
  A1 A2 B1 B2 appeared1 appeared2 present1 present2
1  1  3 10  1         0         0       10        1
2  2  5  0  0         0         0        0        0
3  4  4  5  1         0         0        5        1
4  0  0  1  2         1         2        0        0

如果你有更多的列,你可以使用 for 循环:

out <- data
for (i in 1:2){
  var1 = paste0('appeared',i)
  var2 = paste0('present',i)
  Ai <- paste0('A',i)
  Bi <- paste0('B',i)
  out<- mutate(out,  !!var1 := if_else( !!sym(Ai) == 0, if_else(!!sym(Bi) != 0, !!sym(Bi), 0), 0))
  out<- mutate(out, !!var2 := if_else(!!sym(Ai) != 0, if_else(!!sym(Bi)!= 0, !!sym(Bi), 0), 0))
}

请记住根据您拥有的重复次数更改 for 循环中的范围。

【讨论】:

  • 是的,这可行,但有没有将所有行合并的解决方案?我的原始数据有更多列。无论如何谢谢:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多