R 对不同的变量多次应用dcast
假设我有一个id为a的数据框和几个因子变量 图书馆数据表 图书馆弹琴 多年筹资框架% dcast…~V1,fun.aggregate=f,value.var=V1%>% dcast…~V2,fun.aggregate=f,value.var=V2 colnamesmydf2=cA,V1_x,V1_y,V2_,V2_v,V2_w 如果我们在循环中运行它,那么对于许多变量来说,这似乎是无效的。此外,如果因子的数量因变量而异,则在每一步重命名变量不是很可靠 同一解决方案的循环版本: mydf2=mydf cV1中的fortmp_变量,V2{ ncol_before=ncolmydf2 多年筹资框架2= mydf2%>% dcast as.formula sprintf…~%s,tmp\u变量, fun.aggregate=f,value.var=tmp\u var ncol_after=ncolmydf2 为创建的变量指定正确的名称 colnamesmydf2[ncol\u之前:ncol\u之后]=paste0tmp\u变量,\u,colnamesmydf2[ncol\u之前:ncol\u之后] } 多年筹资框架2 这里有一个cSplit_e选项 或从R基开始使用表 或者在data.table语法中使用相同的方法 这里有一个cSplit_e选项 或从R基开始使用表 或者在data.table语法中使用相同的方法R 对不同的变量多次应用dcast,r,data.table,dcast,R,Data.table,Dcast,假设我有一个id为a的数据框和几个因子变量 图书馆数据表 图书馆弹琴 多年筹资框架% dcast…~V1,fun.aggregate=f,value.var=V1%>% dcast…~V2,fun.aggregate=f,value.var=V2 colnamesmydf2=cA,V1_x,V1_y,V2_,V2_v,V2_w 如果我们在循环中运行它,那么对于许多变量来说,这似乎是无效的。此外,如果因子的数量因变量而异,则在每一步重命名变量不是很可靠 同一解决方案的循环版本: mydf2=myd
非常感谢akrun提供的解决方案。这比我以前看到的任何东西都有效 对表演的快速跟进。定义包含200列和100000个观察值的数据集 N=1e5
mydf非常感谢akrun提供的解决方案。这比我以前看到的任何东西都有效 对表演的快速跟进。定义包含200列和100000个观察值的数据集 N=1e5
mydf您可以获取长格式的数据,将列名和列值组合在一起,创建一个虚拟列并获取宽格式的数据 使用tidyverse可以通过以下方式完成:
library(dplyr)
library(tidyr)
mydf %>%
pivot_longer(cols = starts_with('V')) %>%
unite(name, name, value) %>%
mutate(value = 1) %>%
pivot_wider(values_fill = 0)
# A tibble: 5 x 6
# A V1_x V2_u V2_v V1_y V2_w
# <fct> <dbl> <dbl> <dbl> <dbl> <dbl>
#1 A 1 1 0 0 0
#2 B 1 0 1 0 0
#3 C 0 0 0 1 1
#4 D 1 0 1 0 0
#5 E 0 1 0 1 0
您可以获取长格式的数据,将列名和列值组合起来,创建一个伪列,并获取宽格式的数据 使用tidyverse可以通过以下方式完成:
library(dplyr)
library(tidyr)
mydf %>%
pivot_longer(cols = starts_with('V')) %>%
unite(name, name, value) %>%
mutate(value = 1) %>%
pivot_wider(values_fill = 0)
# A tibble: 5 x 6
# A V1_x V2_u V2_v V1_y V2_w
# <fct> <dbl> <dbl> <dbl> <dbl> <dbl>
#1 A 1 1 0 0 0
#2 B 1 0 1 0 0
#3 C 0 0 0 1 1
#4 D 1 0 1 0 0
#5 E 0 1 0 1 0
这也是一个非常优雅的解决方案。很多,谢谢。事实上,大数据的性能甚至比使用数据之前的报告要好。表方法时差9.892609秒,这是一个非常优雅的解决方案。很多,谢谢。实际上,大数据上的性能甚至比使用数据前的报告要好。表方法时差为9.892609秒
do.call(cbind, lapply(2:3, function(i) table(mydf$A, mydf[[i]])))
nm1 <- names(mydf)[-1]
out <- mydf[, lapply(.SD, function(x)
as.data.frame.matrix(table(A, x))), .SDcols = nm1]
mydf[, names(out) := out][]
# A V1 V2 V1.x V1.y V2.u V2.v V2.w
#1: A x u 1 0 1 0 0
#2: B x v 1 0 0 1 0
#3: C y w 0 1 0 0 1
#4: D x v 1 0 0 1 0
#5: E y u 0 1 1 0 0
library(dplyr)
library(tidyr)
mydf %>%
pivot_longer(cols = starts_with('V')) %>%
unite(name, name, value) %>%
mutate(value = 1) %>%
pivot_wider(values_fill = 0)
# A tibble: 5 x 6
# A V1_x V2_u V2_v V1_y V2_w
# <fct> <dbl> <dbl> <dbl> <dbl> <dbl>
#1 A 1 1 0 0 0
#2 B 1 0 1 0 0
#3 C 0 0 0 1 1
#4 D 1 0 1 0 0
#5 E 0 1 0 1 0
library(data.table)
df1 <- melt(setDT(mydf), id.vars = 'A')
df1[, c('variable', 'value') := .(paste(variable, value, sep = "_"), 1)]
dcast(df1, A~variable, value.var = 'value', fill = 0)