通过数据框申请
Apply through dataframe
我有一个包含两列和两行的简单数据框。我试图遍历每一行以查找第二列中不在第一列中的单词。示例数据:
testdata <- data.frame(rbind(one = c("mango rasberry","mango rasberry blueberry"),
two = c("kiwi strawberry","kiwi strawberry passionfruit")))
因此,输出应该是添加到测试数据的第三列,其中包含第 1 行中的 "Blueberry" 和第 2 行中的 "passionfruit"。
这是我目前拥有的功能:
extract <- function(input) {
extra<- apply(x, function(x) x[setdiff(unlist(str_split(input[,1]," ")), unlist(str_split(input[,2]," ")))])
extra
}
我收到以下错误:
"argument "FUN" is missing, with no default "
你知道解决这个问题的好办法吗?谢谢您的帮助。
尝试:
testdata <- data.frame(rbind(one = c("mango rasberry","mango rasberry blueberry"),
two = c("kiwi strawberry","kiwi strawberry passionfruit")), stringsAsFactors = F)
testdata$differences <- apply(testdata, 1, function(x) {
x1 <- unlist(strsplit(x[1], split = " "))
x2 <- unlist(strsplit(x[2], split = " "))
ifelse(length(x1) > length(x2), base::setdiff(x1,x2), base::setdiff(x2,x1))
})
问题是 setdiff
从第一个参数开始并从那里开始工作。如果它查看第一个参数并发现它的所有元素在第二个参数中都匹配,那么它不会认为存在差异。因此,在这种情况下,元素数量最多的向量应该是第一个参数。
您也可以通过计算 union()
和 intersect()
的差异来完成,如下所示:
apply(testdata, 1, function(x) {
x1 <- unlist(strsplit(x[1], split = " "))
x2 <- unlist(strsplit(x[2], split = " "))
base::setdiff(base::union(x1,x2), base::intersect(x1,x2))
})
期望的输出:
X1 X2 differences
mango rasberry mango rasberry blueberry blueberry
kiwi strawberry kiwi strawberry passionfruit passionfruit
希望对您有所帮助。
我有一个包含两列和两行的简单数据框。我试图遍历每一行以查找第二列中不在第一列中的单词。示例数据:
testdata <- data.frame(rbind(one = c("mango rasberry","mango rasberry blueberry"),
two = c("kiwi strawberry","kiwi strawberry passionfruit")))
因此,输出应该是添加到测试数据的第三列,其中包含第 1 行中的 "Blueberry" 和第 2 行中的 "passionfruit"。
这是我目前拥有的功能:
extract <- function(input) {
extra<- apply(x, function(x) x[setdiff(unlist(str_split(input[,1]," ")), unlist(str_split(input[,2]," ")))])
extra
}
我收到以下错误:
"argument "FUN" is missing, with no default "
你知道解决这个问题的好办法吗?谢谢您的帮助。
尝试:
testdata <- data.frame(rbind(one = c("mango rasberry","mango rasberry blueberry"),
two = c("kiwi strawberry","kiwi strawberry passionfruit")), stringsAsFactors = F)
testdata$differences <- apply(testdata, 1, function(x) {
x1 <- unlist(strsplit(x[1], split = " "))
x2 <- unlist(strsplit(x[2], split = " "))
ifelse(length(x1) > length(x2), base::setdiff(x1,x2), base::setdiff(x2,x1))
})
问题是 setdiff
从第一个参数开始并从那里开始工作。如果它查看第一个参数并发现它的所有元素在第二个参数中都匹配,那么它不会认为存在差异。因此,在这种情况下,元素数量最多的向量应该是第一个参数。
您也可以通过计算 union()
和 intersect()
的差异来完成,如下所示:
apply(testdata, 1, function(x) {
x1 <- unlist(strsplit(x[1], split = " "))
x2 <- unlist(strsplit(x[2], split = " "))
base::setdiff(base::union(x1,x2), base::intersect(x1,x2))
})
期望的输出:
X1 X2 differences
mango rasberry mango rasberry blueberry blueberry
kiwi strawberry kiwi strawberry passionfruit passionfruit
希望对您有所帮助。