【发布时间】:2017-10-26 08:01:34
【问题描述】:
我正在尝试创建一个循环并为每次迭代(其数量可能因源文件而异)构造一个 mutate 语句以根据另一列的值添加一列。
有我的 php 编程背景,在我看来这应该可行:
for(i in number){
colname <- paste("Column",i,sep="")
filtercol <- paste("DateDiff_",i,sep="")
dataset <- mutate(dataset, a = ifelse(b >= 0 & b <= 364,1,NA))
}
但是...正如我现在已经注意到的几次 R 函数有时该函数会完全忽略您已经定义了一个具有该名称的变量 -
因为mutate() 在这里。
因此,我没有得到标题为“a1”、“a2”、“a3”等的几列,而是得到一个标题为“a”的列,每次迭代都会被覆盖。
首先,有人可以向我指出我在哪里出错了,但是其次有人可以向我解释在什么情况下 R 忽略变量名,因为它已经发生了几次,而且看起来非常不一致观点。我敢肯定它不是,这里面有逻辑,但它肯定被很好地混淆了。
还值得一提的是,我最初是这样尝试的:
just.dates <- just.dates %>%
for(i in number){
a <- paste("a",i,sep="")
filtercol <- paste("DateDiff_",i,sep="")
mutate(a = ifelse(filtercol >= 0 & filtercol <= 364),1,NA)
}
但这种方式决定了我在 for() 循环中只需要三个参数时传递了 4 个参数。
【问题讨论】:
-
也许这会有所帮助:stackoverflow.com/questions/26003574/…。这个想法是字符串与变量不同。并且 R 中的某些函数使用非标准评估,其中变量被视为符号名称,而不是像往常一样评估。此外,当使用命名参数调用函数时,变量永远不会在等号(参数名称)的左侧进行计算。
-
a. 顶级版本中
colname和filtercol的意义何在? b. 如果名称已存在,mutate将覆盖列。 c. 在 R 中编写代码几乎总是比for循环更好的方法。在这里,我可以使用purrr::map_df制作一个data.frame 并使用bind_cols,但有很多选择。 d. 如果您真的想在 dplyr 中将字符串变量作为参数传递,则需要使用标准评估。 0.5 意味着mutate_和lazyeval;即将推出的 0.6 意味着 rlang。 -
使用base R 来做这件事很直接。你真的不需要一个包来做这个。使用
DF作为您的数据框:DF[[a]] <- ifelse(DF[[filtercol]] >= 0 & DF[[filtercol]] <= 364, 1, NA)