我想根据条件在各列之间建立链接。我有两个数据帧,如下所示:
df1<-read.table(text=" gol
4
7
6
9
",header=TRUE)
第二个df是:
df2<-read.table(text=" cost1 cost2 cost3 cost4
7 9 5 13
3 12 4 14
9 13 3 11
5 6 2 13
4 3 5 12
8 16 6 9
9 11 2 9
6 14 11 12
5 10 14 6
2 9 4 12
",header=TRUE)
例如,条件是在df2中为cost1,如果该值大于或等于df1中的 4 ,则该值为“ y”,否则为“ n”。在成本2中,如果df1中的值大于或等于7,则为“ y”,否则为“ n”,依此类推。请假设我有四列以上。
结果如下:
output<-read.table(text=" cost1 cost2 cost3 cost4 out1 out2 out3 out4
7 9 5 13 y y n y
3 12 4 14 n y n y
9 13 3 11 y y n y
5 6 2 13 y n n y
4 3 5 12 y n n y
8 16 6 9 y y y y
9 11 2 9 y y n y
6 14 11 12 y y y y
5 10 14 6 y y y n
2 9 4 12 n y n y
",header=TRUE)
我刚才需要使用ifelse进行此操作,但是在本示例中,我很难做到这一点。您的帮助非常有用。
答案 0 :(得分:1)
也许我还没有想到更好,更优雅的解决方案,但是使用带有for
函数的ifelse
循环,您可以执行以下操作:
dfx <- data.frame(matrix(ncol=ncol(df2),nrow = nrow(df2)))
for(i in 1:ncol(df2))
{
dfx[,i] <- ifelse(df2[,i] >= df1[i,1],"y","n")
colnames(dfx)[i] <- paste0("out",i)
}
out <- cbind(df2,dfx)
您将获得以下输出:
> out
cost1 cost2 cost3 cost4 out1 out2 out3 out4
1 7 9 5 13 y y n y
2 3 12 4 14 n y n y
3 9 13 3 11 y y n y
4 5 6 2 13 y n n y
5 4 3 5 12 y n n y
6 8 16 6 9 y y y y
7 9 11 2 9 y y n y
8 6 14 11 12 y y y y
9 5 10 14 6 y y y n
10 2 9 4 12 n y n y
答案 1 :(得分:1)
这是不使用for-loop
的解决方案:
r <- setNames(data.frame(as.matrix(df2)>=outer(rep(1,nrow(df2)),df1$gol)),
paste0("out",seq(ncol(df2))))
r[r==T] <- "y"
r[r==F] <- "n"
res <- cbind(df2,r)
给出:
> res
cost1 cost2 cost3 cost4 out1 out2 out3 out4
1 7 9 5 13 y y n y
2 3 12 4 14 n y n y
3 9 13 3 11 y y n y
4 5 6 2 13 y n n y
5 4 3 5 12 y n n y
6 8 16 6 9 y y y y
7 9 11 2 9 y y n y
8 6 14 11 12 y y y y
9 5 10 14 6 y y y n
10 2 9 4 12 n y n y