我在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一起工作,但没有成功。
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
hts6caw32#
另一个选项是检查I所有行值的所有列的值都为1,并使用as.integer将TRUE/FALSE转换为1/0,如下所示:
as.integer
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
pgpifvop3#
其他的解决方案可以很好地使用巧妙的乘法。这里可能有一个更通用的解决方案,使用ifelse(),它对这两种情况都很有效。
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
gcuhipw94#
您可以使用&检查两者是否都为1,并使用+将TRUE或FLASE转换为1和0。
&
TRUE
FLASE
1
0
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))
4条答案
按热度按时间chhkpiq41#
碱R溶液
dplyr溶液
hts6caw32#
另一个选项是检查I所有行值的所有列的值都为1,并使用
as.integer
将TRUE/FALSE转换为1/0,如下所示:创建于2023年1月18日,使用reprex v2.0.2
pgpifvop3#
其他的解决方案可以很好地使用巧妙的乘法。这里可能有一个更通用的解决方案,使用
ifelse()
,它对这两种情况都很有效。gcuhipw94#
您可以使用
&
检查两者是否都为1,并使用+将TRUE
或FLASE
转换为1
和0
。对于多于两个列以及除了
1
之外的其他条件,将有两种更通用的方法。数据