【发布时间】:2016-12-25 02:04:50
【问题描述】:
我是一名 Stata 用户,试图切换到 R 并且遇到了通常初学者的挣扎。几天来,我一直在尝试(并且失败)循环,现在我投降了。 我想做什么(循环):
从变量名列表开始
创建一个新变量
根据现有变量的值重新编码新变量
可能使用 dplyr 语法这样做,但这不是必需的, 只是为了与我的其余代码保持一致。
这是我正在尝试做的一个程式化的例子。在我的实际数据中,x.x 和 x.y 变量源自应用于 2 个现有数据帧的连接函数。
N <- 1000
df <- data.frame(x1 = rnorm(N),
x2.x = rnorm(N)+2,x2.y = rnorm(N)-2,
x3.x = rnorm(N)+3,x3.y = rnorm(N)-3)
varlist <- c("x2","x3")
lapply(varlist, function(x) {
df <- df %>% mutate(x = ifelse(x1 < 0, paste0(x,".y"),paste0(x,".x")) # generate varialble "x" values from existing x.x and x.y
})
当我运行代码的 lapply 部分时,我收到错误消息
错误:意外的“}”在: " df % mutate(x = ifelse(x1
即使它应该是意料之中的......我确信我的代码中有很多错误,这部分是因为我习惯了 Stata 中的宏,而 R 中没有直接对应的宏。无论如何,如果可以的话为我指明正确的方向,那会很棒!
【问题讨论】:
-
您在
mutate( ... )调用的末尾缺少一个右括号。也就是说,你有 4x(而只有 3x) -
错误信息告诉你
}是意外的;它不是应该在的地方。 -
你在追求
df$x2 <- ifelse(df$x1 < 0, df$x2.y, df$x2.x)这样的东西吗? -
是的。但使用循环并可能使用 dplyr 语法
-
你绝对有使用循环吗?一个简单的
df[, varlist] <- c(ifelse(df$x1 < 0, df$x2.y, df$x2.x), ifelse(df$x1 < 0, df$x3.y, df$x3.x))什么时候可以完成这项工作?