我有一个数据帧,两列包含我不想使用的随机数据,还有10列(列8:17),其中包含几部电影中各种不同名称的演员,每行是一部电影,第8:17栏列出了该电影中的10位顶级演员。我想检查每部电影的这些栏中是否出现了某个演员的名字“ Samuel L. Jackson”(8:17)。
我在数据框的末尾创建了一个空列。 如果名称出现在8:17列中,我想分配1。 如果不是,我希望它为0。
这似乎是一个相当简单的问题,但是我尝试了很多不同的方法,但似乎都没有效果...
该怎么办?
我已经尝试过使用ifelse函数在每行(电影)上进行循环,并且我已经尝试过使用单独的if else语句进行同样的操作。
for (i in nrow(All_dataset)) {
All_dataset[i, 18] <- ifelse("Samuel L. Jackson" %in% All_dataset[i, 8], 1, 0)
All_dataset[i, 18] <- ifelse("Samuel L. Jackson" %in% All_dataset[i, 9], 1, 0)
All_dataset[i, 18] <- ifelse("Samuel L. Jackson" %in% All_dataset[i, 10], 1, 0)
All_dataset[i, 18] <- ifelse("Samuel L. Jackson" %in% All_dataset[i, 11], 1, 0)
All_dataset[i, 18] <- ifelse("Samuel L. Jackson" %in% All_dataset[i, 12], 1, 0)
All_dataset[i, 18] <- ifelse("Samuel L. Jackson" %in% All_dataset[i, 13], 1, 0)
All_dataset[i, 18] <- ifelse("Samuel L. Jackson" %in% All_dataset[i, 14], 1, 0)
All_dataset[i, 18] <- ifelse("Samuel L. Jackson" %in% All_dataset[i, 15], 1, 0)
All_dataset[i, 18] <- ifelse("Samuel L. Jackson" %in% All_dataset[i, 16], 1, 0)
All_dataset[i, 18] <- ifelse("Samuel L. Jackson" %in% All_dataset[i, 17], 1, 0)
}
for (i in nrow(All_dataset)) {
if (is.element("Samuel L. Jackson", All_dataset[i, 8]) == TRUE) {
All_dataset[i, 18] <- 1
}
else if (is.element("Samuel L. Jackson", All_dataset[i, 9]) == TRUE) {
All_dataset[i, 18] <- 1
}
else if (is.element("Samuel L. Jackson", All_dataset[i, 10]) == TRUE) {
All_dataset[i, 18] <- 1
}
else if (is.element("Samuel L. Jackson", All_dataset[i, 11]) == TRUE) {
All_dataset[i, 18] == 1
}
else if (is.element("Samuel L. Jackson", All_dataset[i, 12]) == TRUE) {
All_dataset[i, 18] == 1
}
else if (is.element("Samuel L. Jackson", All_dataset[i, 13]) == TRUE) {
All_dataset[i, 18] <- 1
}
else if (is.element("Samuel L. Jackson", All_dataset[i, 14]) == TRUE) {
All_dataset[i, 18] <- 1
}
else if (is.element("Samuel L. Jackson", All_dataset[i, 15]) == TRUE) {
All_dataset[i, 18] <- 1
}
else if (is.element("Samuel L. Jackson", All_dataset[i, 16]) == TRUE) {
All_dataset[i, 18] <- 1
}
else if (is.element("Samuel L. Jackson", All_dataset[i, 17]) == TRUE) {
All_dataset[i, 18] <- 1
}
else {
All_dataset[i, 18] <- 0
}
}
有时将TRUE分配给所有人,有时将FALSE分配给FALSE,但永远做不到(对于电影Samuel出现为1,如果没有则为0)
答案 0 :(得分:1)
我们将'All_dataset'中的8:17列作为子集,检查它是否等于(==
)与“ Samuel L. Jackson”以返回逻辑矩阵,得到rowSums
,检查如果返回逻辑向量的值大于0,则用as.integer
将其强制转换为二进制(TRUE-> 1,FALSE-> 0),并将其分配(<-
)到第18列
All_dataset[, 18] <- as.integer(rowSums(All_dataset[, 8:17] ==
"Samuel L. Jackson") > 0)
另一个选项是Reduce
和|
。遍历数据子集(lapply
),通过检查字符串list
和{{1}中是否存在字符串,返回逻辑vector
的{{1}} }转换为带有Reduce
的逻辑矢量(即检查相应的元素是否为TRUE),然后像以前一样将其转换为二进制
list