R语言 如何创建一个值为1/0的新列,其中只有在其他两列中的值都为1时,新列中的值才为1?

sg3maiej  于 2023-01-22  发布在  其他
关注(0)|答案(4)|浏览(182)

我在DF内有两列,“湿”和“冷”,分别具有值1和0,例如:

Wet Cold
1     1
0     1
0     1
1     0
1     1
0     0

我想创建一个新列wet&cold,其中只有当wet=1 * 且 * cold=1时,wet&cold=1。如果其中一个或两个为0或不匹配,则wet&cold=0。
我试着和grepl一起工作,但没有成功。

chhkpiq4

chhkpiq41#

碱R溶液

df$`wet&cold` <- df$Wet*df$Cold
df

  Wet Cold wet&cold
1   1    1        1
2   0    1        0
3   0    1        0
4   1    0        0
5   1    1        1
6   0    0        0

dplyr溶液

df %>%
  mutate(`wet&cold`=Wet*Cold)

  Wet Cold wet&cold
1   1    1        1
2   0    1        0
3   0    1        0
4   1    0        0
5   1    1        1
6   0    0        0
hts6caw3

hts6caw32#

另一个选项是检查I所有行值的所有列的值都为1,并使用as.integer将TRUE/FALSE转换为1/0,如下所示:

df$wet_cold = as.integer(rowSums(df == 1) == ncol(df))
df
#>   Wet Cold wet_cold
#> 1   1    1        1
#> 2   0    1        0
#> 3   0    1        0
#> 4   1    0        0
#> 5   1    1        1
#> 6   0    0        0

创建于2023年1月18日,使用reprex v2.0.2

pgpifvop

pgpifvop3#

其他的解决方案可以很好地使用巧妙的乘法。这里可能有一个更通用的解决方案,使用ifelse(),它对这两种情况都很有效。

df <- data.frame(
    wet = c(1, 0, 0, 1, 1, 0),
    cold = c(1, 1, 1, 0, 1, 0)
)

df$wet_cold <- ifelse(df$wet == 1 & df$cold == 1, 1, 0)

df

#     df
#   wet cold wet_cold
# 1   1    1        1
# 2   0    1        0
# 3   0    1        0
# 4   1    0        0
# 5   1    1        1
# 6   0    0        0
gcuhipw9

gcuhipw94#

您可以使用&检查两者是否都为1,并使用+将TRUEFLASE转换为10

DF["wet&cold"] <- +(DF$wet & DF$cold)

#DF
#  wet cold wet&cold
#1   1    1        1
#2   0    1        0
#3   0    1        0
#4   1    0        0
#5   1    1        1
#6   0    0        0

对于多于两个列以及除了1之外的其他条件,将有两种更通用的方法。

DF["wet&cold"] <- +(apply(DF==1, 1, all))

DF["wet&cold"] <- +(rowSums(DF != 1) == 0)

数据

DF <- data.frame(wet = c(1, 0, 0, 1, 1, 0), cold = c(1, 1, 1, 0, 1, 0))

相关问题