r - 将某些列的值和列名的所有组合放入一行
问题描述
我有一个数据框列表,所有这些都是相同的维度(64 obs,12 个变量)。我需要以这样一种方式“展平”这些数据框,即我返回 64 x 11 = 704 个变量和一个观察值,推导出具有所有唯一值的一列和数据框的列名的所有组合。下面提供了示例。
我曾尝试使用acast
并melt
实现这一目标。但是,当必须将这种方法应用到超过 100k+ 数据帧时,熔化前和熔化后的支持操作使这种方法变慢。
这是一个示例数据框和我采取的方法:
df <- data.frame(var1=c(1,2,3),name=c("these","are","names"),var3=c(4,NA,NA),var4=c(NA,NA,5),var6=c(NA,5,NA))
flattening <- function(df){
rownames(df) <- df$name
df$name <- NULL
df <- melt(as.matrix(df)) %>% group_by(name = paste0(Var1,"_",Var2)) %>% summarise(
value = first(value)
) %>% data.frame()
cnames <- df$name
df <- data.frame(values=df$value) %>% t() %>% data.frame()
names(df) <- cnames
df
}
flattening(df)
示例 df 如下所示:
var1 name var3 var4 var6
1 1 these 4 NA NA
2 2 are NA NA 5
3 3 names NA 5 NA
我正在寻找预期的结果:
are_var1 are_var3 are_var4 are_var6 names_var1 names_var3 names_var4 names_var6 these_var1 these_var3 these_var4 these_var6
values 2 NA NA 5 3 NA 5 NA 1 4 NA NA
结果更新:
expr
我在用户句柄下面有一个微基准:
Unit: milliseconds
expr min lq mean median uq max neval cld
old 78.370093 81.038799 90.272721 85.694885 89.304528 1114.03968 500 c
tmfmnk 11.829791 12.697675 13.844833 13.134485 13.623065 34.91430 500 b
s_t 1.476159 1.774409 2.030418 1.873876 2.003681 16.89159 500 a
解决方案
一个dplyr
选项tidyr
可能是:
df %>%
gather(var, val, -2) %>%
mutate(var = paste(name, var, sep = "_")) %>%
select(-name) %>%
spread(var, val)
are_var1 are_var3 are_var4 are_var6 names_var1 names_var3 names_var4 names_var6
1 2 NA NA 5 3 NA 5 NA
these_var1 these_var3 these_var4 these_var6
1 1 4 NA NA
它应该比你原来的方法更快,但是,肯定有更快的可能性。
推荐阅读
- android - 构建项目时出现 IllegalStateException
- django - 在 Django DetailView 中遍历多个外键
- javascript - 如何将子元素附加到悬停元素?
- python - Pandas.Unstack Python
- reactjs - TypeError: vis_network__WEBPACK_IMPORTED_MODULE_3__.DataSet 不是构造函数
- go - 在 Buffalo 中集成 Sentry 和 Elastic APM
- node.js - 如何汇总结果并按给定字段分组?
- python-3.x - 如何从 Pandas 的另一个表中获取布尔值
- xampp - phpmyadmin 错误:需要 PHP 7.1.3+。当前安装的版本是:7.0.27
- c - 为什么我的程序一次将其输入反转一行不起作用?