以前很难解决这个问题。因此,有效地尝试在宽数据框中选择单元格,其中一列中的值包含在列名的字符串中。我通常在我的工作流程中使用tidyverse,并且无法使该节中的任何内容正常工作。尝试应用,用于遍历行。有一些东西可以工作,但是速度很慢。所附的数据帧摘要只是180万行数据帧的前10行。因此,在这里不可能使用tidy::gather
。关于如何实现此目标的任何想法都将很有用,因为它比我预期的要频繁得多。
library(tidyverse)
library(foreach)
df <- read_csv('test_data.csv')
因此,我在这里尝试查找包含在fire_year
宽字段中的var_
变量。例如,在这里,如果fire_year
= 1998,那么我想捕获名为var_1998
的列中的值。这是我所能获得的最接近解决方案的方法(它可以工作!),但是它在整个数据帧上永远都需要花费时间:
df_slim <- foreach(df=iter(df, by='row'), .combine=rbind,
.packages = c('dplyr', "tidyverse")) %do% {
df_out <- df %>%
gather(key = key, value = out_var, -fpa_id, -fire_year) %>%
separate(key,
into = c("tmp1", 'zyear'),
sep = "_") %>%
mutate(var = ifelse(fire_year == zyear, out_var, NA)) %>%
na.omit() %>%
dplyr::select(fpa_id, fire_year, var)
return(df_out)
}
我无法找到快速有效的方式来完成我的一生!至此,我已经计算出在170万行数据帧上完成此for循环将需要160个小时!如果有人可以指出正确的方向,我将永远感激不已!
谢谢!
答案 0 :(得分:1)
我不是100%确定您需要什么,但这是我的看法(使用data.table)
library(data.table)
dt <- data.table(test_data)
setkey(dt, "fire_year")
for(i in unique(dt[["fire_year"]])){
dt[fire_year == i, var:= get(paste("var", i, sep = "_"))]
}
然后将所需的cols子集
dt_slim <- dt[,.SD, .SDcols = c("fpa_id", "fire_year", "var")]
dt_slim
fpa_id fire_year var
1: FS-1418827 2004 0
2: FS-1418835 2004 9
3: FS-1418845 2004 0
4: FS-1418847 2004 0
5: FS-1418849 2004 0
6: FS-1418851 2004 0
7: FS-1418859 2004 0
8: FS-1418826 2005 0
9: FS-1418854 2005 0
10: FS-1418856 2005 114
未经180万行测试。应该相对快速。尽管对时间感兴趣...