【问题标题】:replace data frame values in R with double conditions用双重条件替换 R 中的数据框值
【发布时间】:2014-07-29 05:40:31
【问题描述】:

我有这个数据框:

 A  B     C      D
 1  cola  light  0
 2  cola  light  0
 3  cola  lemon  0
 4  Pepsi lemon  0
 5  Pepsi lemon  0

我想对“B”和“C”做一个双重条件,并将结果放在D中,例如(伪代码):

 if B=="cola" and C=="light"
  D=10 else D=20

在 R 中我使用 ifelse 来做,但我的问题是 B="Cola" 或 c="light" 总是 FALSE,我是 java 用户,比较字符串或字符更容易,我使用 (equals 或 compareTo )。但是在 R 中我不知道如何处理这种问题,我尝试使用 as.character 对其进行转换,但没有结果。我的条件仍然在重新调整 False。

感谢您的帮助

【问题讨论】:

  • 请发布你正在运行的 R 代码,它总是返回 FALSE
  • 你想要== 这是一个相等性测试,= 是一个作业
  • @josilber 我运行的 R 代码是 zx8754 提出的 ifelse 条件 (df$D

标签: r dataframe conditional-statements


【解决方案1】:

或者

 dat$D <- c(20,10)[(dat$B=="cola" & dat$C=="light")+1]
dat$D
#[1] 10 10 20 20 20

数据

dat <- structure(list(A = 1:5, B = c("cola", "cola", "cola", "Pepsi", 
"Pepsi"), C = c("light", "light", "lemon", "lemon", "lemon"), 
D = c(0L, 0L, 0L, 0L, 0L)), .Names = c("A", "B", "C", "D"
), class = "data.frame", row.names = c(NA, -5L))

更新

如果您的数据集列是:

 dat$B <- c( " cola ", " cola", "cola ", "Pepsi", "Pepsi")
 c(20,10)[(dat$B=="cola" & dat$C=="light")+1]
 #[1] 20 20 20 20 20

在这种情况下,

  c(20,10)[(grepl("cola", dat$B)&grepl("light", dat$C)) +1]
 #[1] 10 10 20 20 20

或者你可以使用str_trim

library(stringr)

dat[,2:3] <- lapply(dat[,2:3], str_trim) 
c(20,10)[(dat$B=="cola" & dat$C=="light")+1]
 #[1] 10 10 20 20 20

【讨论】:

    【解决方案2】:

    这应该可行:

    df$D <- ifelse(df$B == "cola" & df$C == "light", 10, 20)
    

    【讨论】:

    • 谢谢,但它用 20 替换所有内容,这意味着条件返回 False。同样的问题
    • 这是 ifelse 所做的,如果条件为 True 则执行此操作,否则 (False) 执行此操作...请进一步说明您的问题。
    • 是的,我理解 ifelse,但即使条件为真,“C”的值也都是 20(我在 B 中有可乐,在 C 中有光,它返回 20
    • @foboss,请提供strdput 的数据
    【解决方案3】:
    A <- 1:5
    B <- c(rep("cola",3), rep("Pepsi", 2))
    C <- c(rep("light",2), rep("lemon", 3))
    D <- rep(0,5)
    

    然后我的 data.frame 和你的一模一样

    > data
      A     B     C D
    1 1  cola light 0
    2 2  cola light 0
    3 3  cola lemon 0
    4 4 Pepsi lemon 0
    5 5 Pepsi lemon 0
    

    根据@zx8754

    > data$D <- ifelse(data$B=="cola" & data$C=="light", 10,20)
    > data
      A     B     C  D
    1 1  cola light 10
    2 2  cola light 10
    3 3  cola lemon 20
    4 4 Pepsi lemon 20
    5 5 Pepsi lemon 20
    

    【讨论】:

    • @userR 我无法像你一样创建数据框,因为我是从数据库中获取它的,它大约有 2240 个观察值,为什么它不起作用?在这两种情况下我仍然有错误
    • 那么您的问题将是从外部数据库导入数据。我可以知道您使用的是哪种数据库吗? MySQL? T
    • 是的,我正在使用 Mysql,我只是注意到“B”和“C”是因子,这可能是 ifelse 的问题?
    • 还是一样的问题 全部换成20,条件不满足
    • 因子字段与字符串比较即可,无需转换。
    猜你喜欢
    • 2019-01-02
    • 2021-04-13
    • 1970-01-01
    • 2012-11-09
    • 1970-01-01
    • 1970-01-01
    • 2021-01-29
    • 2019-12-07
    • 1970-01-01
    相关资源
    最近更新 更多