我在R中有一个data.frame,其中某些列具有数值。我想确定在某一点具有行值更改的列。例如:
A B C D E
0 6 0 0 0
0 6 0 1 -5
0 0 0 2 4
4 0 0 2 -1
我想确定,对于E列中的负行,A,B,C或D的行值与上一行是否有所不同?因此,对于E列中的-5,我要标识的列是D,因为它的行值从0变为1,对于E列中的-1,我要标识A列。一种创建另一个将A,B,C或D标识为行更改列的列的方法?先感谢您
我想您可以为前4列创建一个差异矩阵(使用数据框df
):
df_diff <- rbind(0, diff(as.matrix(df[1:4])))
这会给你:
A B C D
[1,] 0 0 0 0
[2,] 0 0 0 1
[3,] 0 -6 0 1
[4,] 4 0 0 0
然后,sapply
将索引用于数据框和其他矩阵,可以执行以下操作:
df$F <- sapply(seq_len(nrow(df)), function(i) ifelse(df[i, 5] < 0,
names(which(df_diff[i, ] != 0))[1],
NA_character_))
这将检查第5列中的负值,对于那些负数,请选择找到的第一列名称,该名称在不同矩阵中标识为差异(差异不为零)。否则,将放入NA
。新列F
将包含此结果。
输出量
A B C D E F
1 0 6 0 0 0 <NA>
2 0 6 0 1 -5 D
3 0 0 0 2 4 <NA>
4 4 0 0 2 -1 A
数据
df <- structure(list(A = c(0, 0, 0, 4), B = c(6, 6, 0, 0), C = c(0,
0, 0, 0), D = c(0, 1, 2, 2), E = c(0, -5, 4, -1), F = c(NA, "D",
NA, "A")), row.names = c(NA, -4L), class = "data.frame")
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句