我在重复的开始(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 的输出,如果不是零。 感谢您的帮助!
你可以用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 循环中的范围。