【发布时间】: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 <- data.frame(cbind(condition,SZ01,SZ02,SZ03), stringsAsFactor=FALSE)进行更正。 -
感谢 cmets - 我是这样改的……但我的代码(和下面的代码)仍然不起作用:-/
标签: r if-statement for-loop