r - if else where cell 包含在列名字符串中
问题描述
尝试将这个问题编码出来时遇到了困难。因此,我试图在一个宽数据框中选择单元格,其中一列中的值包含在列名的字符串中。我通常在我的工作流程中使用 tidyverse,并且无法让该诗句中的任何内容起作用。尝试应用,用于循环遍历行。有一些事情要做,但它们非常慢。附加的数据框片段只是 180 万行数据框的前 10 行。所以tidy::gather
在这里使用是不可能的。关于如何实现这一点的任何想法都会非常有用,因为它出现的频率比我预期的要多得多。
library(tidyverse)
library(foreach)
df <- read_csv('test_data.csv')
所以在这里我试图找到fire_year
包含在广泛var_
字段中的变量。因此,例如,这里 if 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 个小时!如果有人能指出我正确的方向,我将永远感激不尽!
谢谢!
解决方案
我不是 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 万行上进行测试。应该比较快。不过对时间感兴趣...
推荐阅读
- java - 我想在 java 6 中将字符串转换为日期格式
- python - 将字符串拆分为数字(Python)
- gcc - 带有 make/configure gcc 的 Windows 10 中的 OMNET++ 安装错误
- powershell - 有没有办法用唯一的嵌套对象“选择 * -Unique”,而不更改对象?
- scala - 将`@unchecked` 放在哪里来抑制“未检查细化类型上的模式匹配”?
- json - Spring Boot 在 json 中包含 ID 字段
- java - Spring Reactive - 收集一系列分页结果作为所有结果的 Mono
- javascript - JS中带有另一个参数的事件参数
- ruby-on-rails - 为什么 Rails 不能识别新安装的 Ruby 版本?
- c# - .NET Core (2.1) Web API 动态命名控制器操作的路由