R 如何创建一个新列,指示某些其他列是否包含给定值?
我希望在data.frame中有一个新的列,以指示对于每一行,数字“2”是否出现在某些其他列中。下面是一个适用于小型data.frame的简单版本:R 如何创建一个新列,指示某些其他列是否包含给定值?,r,dplyr,R,Dplyr,我希望在data.frame中有一个新的列,以指示对于每一行,数字“2”是否出现在某些其他列中。下面是一个适用于小型data.frame的简单版本: df <- data.frame(mycol.1 = 1:5, mycol.2= 5:1, other.col = -2:2) df$mycols.contain.two <- df$mycol.1 ==2 | df$mycol.2 ==2 df mycol.1 mycol.2 other.col mycols.contain.
df <- data.frame(mycol.1 = 1:5, mycol.2= 5:1, other.col = -2:2)
df$mycols.contain.two <- df$mycol.1 ==2 | df$mycol.2 ==2
df
mycol.1 mycol.2 other.col mycols.contain.two
1 1 5 -2 FALSE
2 2 4 -1 TRUE
3 3 3 0 FALSE
4 4 2 1 TRUE
5 5 1 2 FALSE
df您可以通过索引来实现它。让我们看一下mtcars
数据
head(mtcars)
mpg cyl disp hp drat wt qsec vs am gear carb
Mazda RX4 21.0 6 160 110 3.90 2.620 16.46 0 1 4 4
Mazda RX4 Wag 21.0 6 160 110 3.90 2.875 17.02 0 1 4 4
Datsun 710 22.8 4 108 93 3.85 2.320 18.61 1 1 4 1
Hornet 4 Drive 21.4 6 258 110 3.08 3.215 19.44 1 0 3 1
Hornet Sportabout 18.7 8 360 175 3.15 3.440 17.02 0 0 3 2
Valiant 18.1 6 225 105 2.76 3.460 20.22 1 0 3 1
之后,我们可以索引任何列。假设我们对第8列到第11列感兴趣
mtcars$new <- rowSums(mtcars[,8:11]==2)>0
你可以做:
df <- data.frame(mycol.1 = 1:5, mycol.2= 5:1, other.col = -2:2)
df$TYPE <- ifelse(rowSums(ifelse(sapply(df, function (x){x == 2}), 1, 0)) > 0 , "TRUE", "FALSE")
# > df
# mycol.1 mycol.2 other.col TYPE
# 1 1 5 -2 FALSE
# 2 2 4 -1 TRUE
# 3 3 3 0 FALSE
# 4 4 2 1 TRUE
# 5 5 1 2 TRUE
df
#mycol.1 mycol.2其他col类型
#1 15-2错误
#2 4-1正确
#30错
#4 2 1正确
#5 5 1 2正确
您可以使用一个简单的apply()
循环:
df <- data.frame(mycol.1 = 1:5, mycol.2= 5:1, other.col = -2:2)
df$mycols.contain.two <- apply(df, 1, function(x){any(x == 2)})
dfdf$new\u col=rowSums(df[,1:2]==2)>0
您可以使用grep()
使用名称搜索仅选择某些列。如果添加
df <- data.frame(mycol.1 = 1:5, mycol.2= 5:1, other.col = -2:2)
df$mycols.contain.two <- apply(df, 1, function(x){any(x == 2)})
df <- data.frame(mycol.1 = 1:5, mycol.2= 5:1, other.col = -2:2)
df$mycols.contain.two <- apply(df, 1, function(x){any(x[1:3] == 2)})