簡體   English   中英

如何創建一個值為 1/0 的新列,其中僅當其他兩個列中的值均為 1 時新列中的值為 1?

[英]How can I create a new column with values 1/0, where the value in the new column is 1 only if values in two other columns are both 1?

我在 DF 中有兩列,“濕”和“冷”,值分別為 1 和 0,例如:

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

我想創建一個新列 wet&cold,只有當 wet=1cold=1 時,wet&cold=1。 如果其中任何一個或兩個都為 0 或不匹配,則 wet&cold=0。

我嘗試使用 grepl 解決問題,但沒有成功。

基地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

另一種選擇是檢查所有行值的所有列的值為 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-01-18,使用reprex v2.0.2

其他解決方案適用於巧妙的乘法。 這也許是一個使用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

您可以使用&檢查兩者是否為 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))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM