pivot_wider 是否有替代的 r 基函数?
Are there alternative r base functions to pivot_wider?
我有以下类型 table:
经济特区
Class
值
1_1_1
1
2
1_1_1
5
2
1_1_2
5
2
1_1_3
1
1
1_1_3
5
2
1_1_4
1
1
1_1_5
2
1
1_2_1
1
2
1_2_1
5
2
为了在多个新列中传播列“Class”,从“Val”列中获取值,我使用了 pivot_wider 并且一切顺利。我输入了这个代码:
pivot_wider(names_from = Class, values_from = Val, names_sort=T, values_fill = list(n = 0))
得到这样的结果:
塞兹
1
2
3
4
5
6
7
1_1_1
2
0
0
0
2
0
0
1_1_2
0
0
0
0
2
0
0
1_1_3
1
0
0
0
2
0
0
不幸的是,我不得不使用只有基本 R 包的外部计算机,而且请求额外包的时间并不短。
我尝试使用这个解决方案:
newdata <- xtabs(dat$Val ~ dat$Sez + dat$Class)
但它为我提供了每一行的频率分布:
经济特区
Class
频率
1_1_1
1
2
1_1_2
1
0
1_1_3
1
1
1_1_4
1
1
1_1_5
1
0
1_2_1
1
1
我正在寻找一个具有 R 基本功能的解决方案,它给我一个与 pivot_wider 使用的对象相同的对象。
我们将 'Class' 创建为 factor
并使用 xtabs
df1$Class <- factor(df1$Class, levels = 1:7)
xtabs(Val ~ SEZ + Class, df1)
-输出
Class
SEZ 1 2 3 4 5 6 7
1_1_1 2 0 0 0 2 0 0
1_1_2 0 0 0 0 2 0 0
1_1_3 1 0 0 0 2 0 0
1_1_4 1 0 0 0 0 0 0
1_1_5 0 1 0 0 0 0 0
1_2_1 2 0 0 0 2 0 0
如果我们需要data.frame
输出
out <- as.data.frame.matrix( xtabs(Val ~ SEZ + Class, df1))
out$SEZ <- row.names(out)
row.names(out) <- NULL
数据
df1 <- structure(list(SEZ = c("1_1_1", "1_1_1", "1_1_2", "1_1_3", "1_1_3",
"1_1_4", "1_1_5", "1_2_1", "1_2_1"), Class = c(1L, 5L, 5L, 1L,
5L, 1L, 2L, 1L, 5L), Val = c(2L, 2L, 2L, 1L, 2L, 1L, 1L, 2L,
2L)), row.names = c(NA, -9L), class = "data.frame")
另一个基础 R 选项使用 reshape
+ merge
reshape(
merge(df,
expand.grid(
SEZ = unique(df$SEZ),
Class = 1:7
),
all = TRUE
),
direction = "wide",
idvar = "SEZ",
timevar = "Class"
)
给予
SEZ Val.1 Val.2 Val.3 Val.4 Val.5 Val.6 Val.7
1 1_1_1 2 NA NA NA 2 NA NA
8 1_1_2 NA NA NA NA 2 NA NA
15 1_1_3 1 NA NA NA 2 NA NA
22 1_1_4 1 NA NA NA NA NA NA
29 1_1_5 NA 1 NA NA NA NA NA
36 1_2_1 2 NA NA NA 2 NA NA
我有以下类型 table:
经济特区 | Class | 值 |
---|---|---|
1_1_1 | 1 | 2 |
1_1_1 | 5 | 2 |
1_1_2 | 5 | 2 |
1_1_3 | 1 | 1 |
1_1_3 | 5 | 2 |
1_1_4 | 1 | 1 |
1_1_5 | 2 | 1 |
1_2_1 | 1 | 2 |
1_2_1 | 5 | 2 |
为了在多个新列中传播列“Class”,从“Val”列中获取值,我使用了 pivot_wider 并且一切顺利。我输入了这个代码:
pivot_wider(names_from = Class, values_from = Val, names_sort=T, values_fill = list(n = 0))
得到这样的结果:
塞兹 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
---|---|---|---|---|---|---|---|
1_1_1 | 2 | 0 | 0 | 0 | 2 | 0 | 0 |
1_1_2 | 0 | 0 | 0 | 0 | 2 | 0 | 0 |
1_1_3 | 1 | 0 | 0 | 0 | 2 | 0 | 0 |
不幸的是,我不得不使用只有基本 R 包的外部计算机,而且请求额外包的时间并不短。
我尝试使用这个解决方案:
newdata <- xtabs(dat$Val ~ dat$Sez + dat$Class)
但它为我提供了每一行的频率分布:
经济特区 | Class | 频率 |
---|---|---|
1_1_1 | 1 | 2 |
1_1_2 | 1 | 0 |
1_1_3 | 1 | 1 |
1_1_4 | 1 | 1 |
1_1_5 | 1 | 0 |
1_2_1 | 1 | 1 |
我正在寻找一个具有 R 基本功能的解决方案,它给我一个与 pivot_wider 使用的对象相同的对象。
我们将 'Class' 创建为 factor
并使用 xtabs
df1$Class <- factor(df1$Class, levels = 1:7)
xtabs(Val ~ SEZ + Class, df1)
-输出
Class
SEZ 1 2 3 4 5 6 7
1_1_1 2 0 0 0 2 0 0
1_1_2 0 0 0 0 2 0 0
1_1_3 1 0 0 0 2 0 0
1_1_4 1 0 0 0 0 0 0
1_1_5 0 1 0 0 0 0 0
1_2_1 2 0 0 0 2 0 0
如果我们需要data.frame
输出
out <- as.data.frame.matrix( xtabs(Val ~ SEZ + Class, df1))
out$SEZ <- row.names(out)
row.names(out) <- NULL
数据
df1 <- structure(list(SEZ = c("1_1_1", "1_1_1", "1_1_2", "1_1_3", "1_1_3",
"1_1_4", "1_1_5", "1_2_1", "1_2_1"), Class = c(1L, 5L, 5L, 1L,
5L, 1L, 2L, 1L, 5L), Val = c(2L, 2L, 2L, 1L, 2L, 1L, 1L, 2L,
2L)), row.names = c(NA, -9L), class = "data.frame")
另一个基础 R 选项使用 reshape
+ merge
reshape(
merge(df,
expand.grid(
SEZ = unique(df$SEZ),
Class = 1:7
),
all = TRUE
),
direction = "wide",
idvar = "SEZ",
timevar = "Class"
)
给予
SEZ Val.1 Val.2 Val.3 Val.4 Val.5 Val.6 Val.7
1 1_1_1 2 NA NA NA 2 NA NA
8 1_1_2 NA NA NA NA 2 NA NA
15 1_1_3 1 NA NA NA 2 NA NA
22 1_1_4 1 NA NA NA NA NA NA
29 1_1_5 NA 1 NA NA NA NA NA
36 1_2_1 2 NA NA NA 2 NA NA