我正在尝试基于同一行的3列之间是否存在直接字符匹配来创建新列。然后,如果有匹配项,我想在新列中放入1;如果没有匹配项,则要在0中放入。这是数据示例:
ID var1 var2 var3
1 1 abc def abc
2 2 def xyz jkl
3 3 ghi abc abc
4 4 jkl jkl def
5 4 jkl jkl NA
...
这是我的代码:
prodprov$var_match <- 0
for(i in 1:nrow(prodprov)) {
if(prodprov$var1[i] == prodprov$var2[i] |
prodprov$var1[i] == prodprov$var3[i] ) {
prodprov$var_match <- 1
}
}
但是我得到这个错误: if(prodprov $ var1 [i] == prodprov $ var2 [i] |: 缺少需要TRUE / FALSE的值
最终数据框应如下所示:
ID var1 var2 var3 var_match
1 1 abc def abc 1
2 2 def xyz jkl 0
3 3 ghi abc abc 0
4 4 jkl jkl def 1
5 4 jkl jkl NA 1
...
关于如何解决此问题的任何想法?所有这些变量都是相同的数据类型(字符)。预先感谢!
答案 0 :(得分:1)
选项为Reduce
和|
as.integer(Reduce(`|`, lapply(df1[-(1:2)], `==`, df1$var1)))
或带有rowSums
的选项
df1$var_match <- as.integer( rowSums(df1[c('var2', 'var3')] ==
rep(df1$var1, 2)) > 0)
df1$var_match
#[1] 1 0 0 1
df1 <- structure(list(ID = 1:4, var1 = c("abc", "def", "ghi", "jkl"),
var2 = c("def", "xyz", "abc", "jkl"), var3 = c("abc", "jkl",
"abc", "def")), class = "data.frame", row.names = c("1",
"2", "3", "4"))
答案 1 :(得分:0)
您可以利用R中的矢量化优势:
df$var_match <- df$var1 == df$var2 | df$var1 == df$var3
结果:
df
# var1 var2 var3 var_match
# 1 abc def abc TRUE
# 2 def xyz jkl FALSE
# 3 ghi abc abc FALSE
# 4 jkl jkl def TRUE
# 5 jkl jkl <NA> TRUE
输入数据框以确保完整性:
df <- data.frame(stringsAsFactors = FALSE,
var1 = c("abc", "def", "ghi", "jkl", "jkl"),
var2 = c("def", "xyz", "abc", "jkl", "jkl"),
var3 = c("abc", "jkl", "abc", "def", NA)
)