[英]Compare multiple columns and create new ones in R
我在重复的开始(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))
所需的 output:
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))
如您所见,如果Data最后出现,我希望B的output在多列中,如果不是零应该传递。 如果数据仍然存在,我还需要 B 的 output,如果不是零的话。 感谢帮助!
您可以使用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))
Output:
> 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 循环中的范围。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.