【问题标题】:Get value from other column based on value of a column根据列的值从其他列获取值
【发布时间】:2016-08-23 15:00:15
【问题描述】:

对于数据框中的每一行,我想根据第三列中的值将一个值从一列复制到另一列。

我尝试使用组合 for 循环和 if 函数来做到这一点:

    ## example

condition <- c("1","2","2","1","2","","3","3")
SZ01 <- c("1","1","1","1","1","","1","1")
SZ02 <- c("2","2","2","2","2","","2","2")
SZ03 <- c("3","3","3","3","3","","3","3")


df <- data.frame(cbind(condition,SZ01,SZ02,SZ03), stringsAsFactors = FALSE)


df$retribution <- NULL
df$special_prevention <- NULL
df$general_prevention <- NULL


for (i in 1:length(df$condition)){ 

  if (df$condition[i] == 1){

    df$retribution[i] <- df$SZ01[i]
    df$special_prevention[i] <- df$SZ02[i]
    df$general_prevention[i] <- df$SZ03[i]


  }else if (df$condition[i] == 2) {

    df$retribution[i] <- df$SZ02[i]
    df$special_prevention[i] <- df$SZ03[i]
    df$general_prevention[i] <- df$SZ01[i]

  }else if (df$condition[i] == 3) {

    df$retribution[i] <- df$SZ03[i]
    df$special_prevention[i] <- df$SZ01[i]
    df$general_prevention[i] <- df$SZ02[i]

  } else {
    df$retribution[i] <- "missing_condition"
    df$special_prevention[i] <- "missing_condition"
    df$general_prevention[i] <- "missing_condition"

  }
}

这似乎有效(没有错误消息),但是查看我的数据肯定有问题。

例如,第 1 行有 condition == 1。这意味着,对于这一行 df$retribution 应该接收与 df$SZ01 的第 1 行中的值相同的值。

但事实并非如此。有没有人能看出我犯的错误?

【问题讨论】:

  • 你能添加一个你的初始data.frame和你想要的输出的例子吗?
  • 现在对您来说更有意义了吗?不幸的是,我不知道如何在文本中添加表格...
  • 如果您想添加表格,您可以简单地粘贴命令dput(df)的结果,其中df是您要显示的数据框。
  • 问题在于condition, SZ01, SZ02, SZ03 都是因素。使用str(df) 来查看并使用df &lt;- data.frame(cbind(condition,SZ01,SZ02,SZ03), stringsAsFactor=FALSE) 进行更正。
  • 感谢 cmets - 我是这样改的……但我的代码(和下面的代码)仍然不起作用:-/

标签: r if-statement for-loop


【解决方案1】:

尝试以下方法:

condition <- c("1","2","2","1","2","","3","3")
SZ01 <- c("1","1","1","1","1","","1","1")
SZ02 <- c("2","2","2","2","2","","2","2")
SZ03 <- c("3","3","3","3","3","","3","3")


df <- data.frame(cbind(condition,SZ01,SZ02,SZ03), stringsAsFactors = F)

df$retribution <- ifelse(df$condition == "1", df$SZ01,
                         ifelse(df$condition == "2", df$SZ02,
                            ifelse(df$condition == "3", df$SZ03, "missing")))

df$special_prevention <- ifelse(df$condition == "1", df$SZ02, 
                                ifelse(df$condition == "2", df$SZ03,
                                       ifelse(df$condition == "3", df$SZ01, "missing")))

df$general_prevention <- ifelse(df$condition == "1", df$SZ03, 
                                ifelse(df$condition == "2", df$SZ01,
                                       ifelse(df$condition == "3", df$SZ02, "missing"))))

输出:

df
  condition SZ01 SZ02 SZ03 retribution special_prevention general_prevention
1         1    1    2    3           1                  2                  3
2         2    1    2    3           2                  3                  1
3         2    1    2    3           2                  3                  1
4         1    1    2    3           1                  2                  3
5         2    1    2    3           2                  3                  1
6                              missing            missing            missing
7         3    1    2    3           3                  1                  2
8         3    1    2    3           3                  1                  2

【讨论】:

  • 有点模糊。你有错误吗?我的代码的输出是否高于您期望的正确值?
  • 是的,这就是我想要得到的输出......我也希望我的代码也有相同的输出......我没有收到任何错误消息,但新变量中的所有值(报应, special_prevention, general_prevention) 是值“2”
  • 我遇到了同样的问题,这可能是由于某些变量是因素。将四个初始变量转换为字符,它应该可以工作。我将稍微更改代码以使其更加一致。
  • 我也是这样做的……但昨天没用。然而,今天它做到了。显然这就是问题所在!非常感谢您的帮助
猜你喜欢
  • 2021-09-27
  • 2016-11-30
  • 1970-01-01
  • 2014-04-23
  • 2016-12-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多