मेरे पास दो कॉलम और दो पंक्तियों वाला एक सरल डेटा फ्रेम है। मैं कॉलम दो में कॉलम दो में कौन से शब्द हैं, यह जानने के लिए प्रत्येक पंक्ति के माध्यम से पुनरावृत्ति करने का प्रयास कर रहा हूं। नमूना डेटा:
testdata <- data.frame(rbind(one = c("mango rasberry","mango rasberry blueberry"),
two = c("kiwi strawberry","kiwi strawberry passionfruit")))
इसलिए, आउटपुट टेस्टडाटा में जोड़ा गया एक तीसरा कॉलम होना चाहिए जिसमें पंक्ति 2 में "ब्लूबेरी" और पंक्ति 2 में "जुनूनफ्रूट" शामिल होना चाहिए।
यह वह कार्य है जो मेरे पास अब तक है:
extract <- function(input) {
extra<- apply(x, function(x) x[setdiff(unlist(str_split(input[,1]," ")), unlist(str_split(input[,2]," ")))])
extra
}
मुझे निम्न त्रुटि मिल रही है:
"तर्क" मज़ा "गायब है, बिना डिफ़ॉल्ट के"
क्या आप जानते हैं कि इसका क्या अच्छा समाधान होगा? आपके सहयोग के लिए धन्यवाद।
उत्तर:
उत्तर № 1 के लिए 1प्रयत्न:
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
आशा है कि ये आपकी मदद करेगा।