创建匹配变量

时间:2017-12-13 23:47:43

标签: r match

我有一个大型数据集但显示了一小部分样本

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))

非常感谢任何建议!

2 个答案:

答案 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)]