【问题标题】:Create a new column with mutate according to conditional values根据条件值使用 mutate 创建一个新列
【发布时间】:2018-03-06 22:03:29
【问题描述】:

我有一个包含 ID、X 和 Y 列的数据框 df

ID = c(1,1,2,2)
X = c(1,0.4,0.8,0.1) 
Y = c(0.5,0.5,0.7,0.7)
df <- data.frame(ID,X,Y)

ID   X   Y
 1 1.0 0.5
 1 0.4 0.5
 2 0.8 0.7
 2 0.1 0.7

我想获得两个新列:

  • Xg 当 X 大于 Y 时等于 X,否则等于 NA
  • Xl 在 X 小于 Y 时等于 X,否则为 NA。也就是说,

    ID   X   Y  Xg  Xl
     1 1.0 0.5 1.0  NA
     1 0.4 0.5  NA 0.4
     2 0.8 0.7 0.8  NA
     2 0.1 0.7  NA 0.1
    

【问题讨论】:

  • 了解ifelse?
  • 您说您有一个数据框,但您将数据绑定为 data.table。你的意思是df &lt;- data.frame(ID,X,Y)?还是您在寻找 data.table 解决方案?
  • @dshkol 因为它打印时没有在 data.tables 中看到通常的1:,所以我将它编辑到 data.frame。
  • 查看case_when 包中的dplyr
  • 感谢您的建议。我尝试了以下方法,但仍然出现错误,因为我的原始数据帧在 X 和 Y 中具有 NA:df1= mutate(df, Xg = ifelse(X > Y, X, NA))。

标签: r dplyr


【解决方案1】:

即使XY 中有 NA,下面也应该可以工作:

library(dplyr)
df %>%
  mutate(Xg = ifelse(X > Y, X, NA),
         Xl = ifelse(X < Y, Y, NA))

如果您想使用dplyr 中的if_else,您必须将NA 转换为数字。 if_elseifelse 更严格,因为它检查 TRUEFALSE 的值是否相同:

df %>%
  mutate(Xg = if_else(X > Y, X, as.numeric(NA)),
         Xl = if_else(X < Y, Y, as.numeric(NA)))

结果:

  ID   X   Y  Xg  Xl
1  1 1.0 0.5 1.0  NA
2  1 0.4 0.5  NA 0.5
3  2 0.8 0.7 0.8  NA
4  2 0.1 0.7  NA 0.7
5  3  NA 1.0  NA  NA
6  3 3.0  NA  NA  NA

数据:

ID = c(1,1,2,2,3,3)
X = c(1,0.4,0.8,0.1,NA,3) 
Y = c(0.5,0.5,0.7,0.7,1,NA)
df <- data.frame(ID,X,Y)

【讨论】:

  • 你可以用NA_real_代替as.numeric(NA)
  • @OttToomet 没错,这就是as.numeric()NA 转换为反正。 (identical(as.numeric(NA), NA_real_)
【解决方案2】:

一些普通的旧 R 索引和子集呢?

ID <- c(1,1,2,2, 3, 3)
X <- c(1,0.4,0.8,0.1, NA, 2) 
Y <-  c(0.5,0.5,0.7,0.7, 2, NA)
Xg <- Xl <- rep(NA_real_, length(ID))
Xg[which(X > Y)] <- X[which(X > Y)]
Xl[which(X < Y)] <- X[which(X < Y)]
data.frame(ID, X, Y, Xg, Xl)

注意:我假设如果缺少 X 或 Y,Xg 和 Xl 应该是 NA。

【讨论】:

    【解决方案3】:

    为了完整起见,并且在编辑之前最初使用data.table() 的问题(并且因为我喜欢简洁的代码)这里是使用data.table 的“单线”就地更新:

    library(data.table)
    setDT(df)[X > Y, Xg := X][X < Y, Xl := X][]
    
       ID   X   Y  Xg  Xl
    1:  1 1.0 0.5 1.0  NA
    2:  1 0.4 0.5  NA 0.4
    3:  2 0.8 0.7 0.8  NA
    4:  2 0.1 0.7  NA 0.1
    5:  3  NA 1.0  NA  NA
    6:  3 3.0  NA  NA  NA
    

    (使用useR的数据)

    NA 会自动处理,因为只有匹配的行会被更新。

    【讨论】:

      猜你喜欢
      • 2017-08-12
      • 2021-08-30
      • 1970-01-01
      • 2022-01-07
      • 1970-01-01
      • 2016-10-07
      • 1970-01-01
      • 1970-01-01
      • 2023-03-25
      相关资源
      最近更新 更多