【发布时间】:2021-10-24 12:38:02
【问题描述】:
我有以下代码和示例数据。我有两个问题:
-
使用 mutate 创建的新变量的名称在相应的数据框中显示为“New_var”,而不是我在 for 循环中分配给它的字符串(例如 df1_timediff)。
基于对类似问题的回答,我在定义 New_var 变量时和管道内都尝试使用 eval、as.name 和 as.character,但没有成功。当我检查 New_var 的类时,R 告诉我它们是“字符”。 -
我希望 New_var 变量成为当前条目与相应参与者的第一个条目之间的时间差变量。我以前使用过类似的代码,但是,New_var 变量似乎与预期不同。也就是说,返回的时间差不是条目之间的月份。 Submitted_i 变量的类是日期格式,所以我很困惑为什么会这样。
代码
names.dfs <- c("df1", "df2", "df3")
for (i in names.dfs){
Submitted_i <- as.name(paste0('Submitted_', i))
New_var <- as.name(paste0(i,'_timediff'))
df_i <- get(i)
df_i <- df_i %>%
arrange(eval(Submitted_i)) %>% # Order by date
group_by(ResultsID) %>%
mutate(New_var = (time_length(difftime(eval(Submitted_i), eval(Submitted_i)[1],"months"))))
assign(paste0(i),df_i)
}
示例数据
df1 <- structure(list(ResultsID = c(1, 2, 3, 4, 2, 4, 1, 5, 3, 3), RepeatNo = c(0L,
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L), Submitted_df1 = structure(c(17509,
17509, 17514, 17484, 17929, 17484, 17502, 17528, 17497, 17488
), class = "Date")), row.names = c(NA, 10L), class = "data.frame")
df2 <- structure(list(ResultsID = c(1, 5, 1, 3, 2, 4, 5), RepeatNo = c(0L,
0L, 0L, 0L, 0L, 0L, 0L), Submitted_df2 = structure(c(16856, 16858,
16869, 16861, 16875, 16888, 16891), class = "Date")), row.names = c(NA,
7L), class = "data.frame")
df3 <- structure(list(ResultsID = c(1, 2, 3, 1, 2, 4, 4, 5, 3), RepeatNo = c(0L,
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L), Submitted_df3 = structure(c(17913,
17930, 17919, 17931, 17921, 17912, 17916, 17931, 17915), class = "Date")), row.names = c(NA,
-9L), groups = structure(list(.rows = structure(list(1L, 2L,
3L, 4L, 5L, 6L, 7L, 8L, 9L), ptype = integer(0), class = c("vctrs_list_of",
"vctrs_vctr", "list"))), row.names = c(NA, -9L), class = c("tbl_df",
"tbl", "data.frame")), class = c("rowwise_df", "tbl_df", "tbl",
"data.frame"))
【问题讨论】:
-
第一个问题:改用
{{ New_var }} :=。
标签: r for-loop dplyr variable-names difftime