在DF中添加一列,并加上一个";是”;如果行的任何元素在R中具有特定值

在DF中添加一列,并加上一个";是”;如果行的任何元素在R中具有特定值,r,dataframe,R,Dataframe,我试图避免使用非常长的if_else语句,甚至是嵌套的for循环来遍历每一行并查看它们的值 但基本上,我有一个如下的数据框(30列,50000行): 如果任何一行有字母Z,一个新的列标记“result”将有一个“Yes”。另外,它将有一个no Col1 Col2 Col3 Col4...Col30 Result Z L D T A Yes D D T Z X Yes L G T

我试图避免使用非常长的if_else语句,甚至是嵌套的for循环来遍历每一行并查看它们的值

但基本上,我有一个如下的数据框(30列,50000行):

如果任何一行有字母Z,一个新的列标记“result”将有一个“Yes”。另外,它将有一个no

 Col1 Col2  Col3 Col4...Col30  Result
    Z     L    D     T     A    Yes
    D     D    T     Z     X    Yes
    L     G    T     A     J    No
    ....

我们可以用
=
创建一个逻辑矩阵,获取
行和
,将其转换为逻辑向量,并将其更改为值1、2索引,并替换为“否”、“是”

df1$Result <- c("No", "Yes")[(rowSums(df1 == "Z") > 0) + 1]

或者我们可以使用
lappy
Reduce

df1$Result <- ifelse(Reduce(`|`, lapply(df1, `==`, "Z")), "Yes", "No")

df1$Result这是一个在新列中返回TRUE和FALSE的版本

df1$Result <- apply(df1, 1, function(r) any(r %in% "Z"))

df1$Result另一个基本R解决方案是使用
ifelse
+
grepl
,即

df$Result <- ifelse(grepl("\\bZ\\b",do.call(paste,df)),"Yes","No")
数据

df <- structure(list(Col1 = c("Z", "D", "L"), Col2 = c("L", "D", "G"
), Col3 = c("D", "T", "T"), Col4 = c("T", "Z", "A"), Col30 = c("A", 
"X", "J")), class = "data.frame", row.names = c(NA, -3L))

df哇!感谢所有这三种解决问题的方法。一旦我同意,我就接受答案!两个都做了!干杯
test$Result <- apply(test, 1, function(r) any(r %in% c("Z","L")))
df$Result <- ifelse(grepl("\\bZ\\b",do.call(paste,df)),"Yes","No")
> df
  Col1 Col2 Col3 Col4 Col30 Result
1    Z    L    D    T     A    Yes
2    D    D    T    Z     X    Yes
3    L    G    T    A     J     No
df <- structure(list(Col1 = c("Z", "D", "L"), Col2 = c("L", "D", "G"
), Col3 = c("D", "T", "T"), Col4 = c("T", "Z", "A"), Col30 = c("A", 
"X", "J")), class = "data.frame", row.names = c(NA, -3L))