如果多个列中的任何一个出现单词,如何分配TRUE或FALSE?

时间:2019-06-02 16:03:36

标签: r

我有一个数据帧,两列包含我不想使用的随机数据,还有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)

1 个答案:

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