在DF中添加一列,并加上一个";是”;如果行的任何元素在R中具有特定值
我试图避免使用非常长的if_else语句,甚至是嵌套的for循环来遍历每一行并查看它们的值 但基本上,我有一个如下的数据框(30列,50000行): 如果任何一行有字母Z,一个新的列标记“result”将有一个“Yes”。另外,它将有一个no在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
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))