我有一个大型数据集但显示了一小部分样本
df = data.frame(v1 = c("Low", "Low", "High"),
v2 = c("Med", "High","Low"),
v3 = c("NA", "Low", "Low"),
ID=c(1L, 1L, 1L),
ID_name = c("AAA", "AA", "A"))
我需要计算v1,v2,v3的匹配数。例如,如果v1为低,v2为低,v3为低,则匹配变量为3.但NA不计入匹配。例如,对于第一行,匹配变量仅为1,因为只有1 Low和1 Med。我在excel中快速完成了这项工作,但需要进行一些排列,并且必须弄清楚如何在r中进行。
我的最终结果应如下所示:
df1 = data.frame(v1 = c("Low", "Low", "High"),
v2 = c("Med", "High","Low"),
v3 = c("NA", "Low", "Low"),
ID=c(1L, 1L, 1L),
ID_name = c("AAA", "AA", "A"),
Consistency = c(1L,2L,2L))
非常感谢任何建议!
答案 0 :(得分:2)
df1$consistency = apply(df1[c("v1", "v2", "v3")], 1, function(x) max(table(x)))
我们只想要最常见值的出现次数。 table
将事件列表并且不计入NA
,因此我们只需查看表格的最大值。
答案 1 :(得分:1)
创建一个TRUE
/ FALSE
表,您可以在其中比较彼此之间的所有列(仅适用于小型OP示例)并在其上使用rowSums
。
library(data.table)
setDT(df)[, .(v1 == v2, v2 == v3, v1 == v3)]
# V1 V2 V3
# 1: FALSE FALSE FALSE
# 2: FALSE FALSE TRUE
# 3: FALSE TRUE FALSE
# Final result
rowSums(setDT(df)[, .(v1 == v2, v2 == v3, v1 == v3)], na.rm = TRUE) + 1
# [1] 1 2 2
修改强>
如果列是因素:
setDT(df)
# Transform factors to character
df[, c("v1", "v2", "v3") := lapply(.SD, as.character), .SDcols = c("v1", "v2", "v3")]
df[, .(v1 == v2, v2 == v3, v1 == v3)]