R 对不同的变量多次应用dcast

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

假设我有一个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语法中使用相同的方法


非常感谢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)