想要将唯一值转换为 first/second/third 个变量
Want to cast unique values into first/second/third variables
我有一个数据集示例需要转换为宽格式,但我有一个特殊问题尚未在 StackOveflow 上得到解决。
我想用来制作长数据集的列的每一行都有唯一值,但我想创建一个新数据集,以便为每个 idvar 的 n 个属性提供 n 个变量。
我需要转换这个:
state sector attribute_value
alabama 1 a
alabama 1 b
alabama 1 c
alabama 1 d
alabama 1 e
alabama 1 f
alabama 1 g
alabama 1 h
alaska 1 i
alaska 1 j
alaska 1 k
alaska 1 l
alaska 1 m
alaska 1 n
alaska 1 o
arizona 1 p
arizona 1 q
arizona 1 r
arizona 1 s
arizona 1 t
arizona 1 u
arizona 1 v
进入:
state sector attribute_value_1 attribute_value_2 attribute_value_3 attribute_value_4 attribute_value_5 attribute_value_6 attribute_value_7 attribute_value_8
alabama 1 a b c d e f g h
alaska 1 i j k l m n o n/a
arizona 1 p q r s t u v n/a
到目前为止,我还不能使用 dcast 或 reshape 来创建这个特定的转换。
试试这个,使用 dplyr
和 splitstackshape
library(dplyr)
library(splitstackshape)
df=df%>%group_by(state,sector)%>%dplyr::summarise(attribute_value=paste(attribute_value,sep=',',collapse = ","))
concat.split(df, 3, drop = TRUE)
state sector attribute_value_1 attribute_value_2 attribute_value_3 attribute_value_4 attribute_value_5 attribute_value_6 attribute_value_7 attribute_value_8
1: alabama 1 a b c d e f g h
2: alaska 1 i j k l m n o NA
3: arizona 1 p q r s t u v NA
与:
library(data.table)
dcast(setDT(df),
state + sector ~ rowid(state, prefix = 'attr_val_'),
value.var = 'attribute_value')
你得到:
state sector attr_val_1 attr_val_2 attr_val_3 attr_val_4 attr_val_5 attr_val_6 attr_val_7 attr_val_8
1: alabama 1 a b c d e f g h
2: alaska 1 i j k l m n o NA
3: arizona 1 p q r s t u v NA
与 dplyr
和 tidyr
。诀窍是设置一个虚拟变量(这里称为 ind
)并使用它来转换为宽格式。
df2 <- df %>% group_by(state, sector) %>%
mutate(ind=paste0("Attribute_", seq_along(attribute_value))) %>%
ungroup() %>%
spread(key=ind, value=attribute_value)
df2
# A tibble: 3 x 10
state sector Attribute_1 Attribute_2 Attribute_3 Attribute_4 Attribute_5 Attribute_6 Attribute_7 Attribute_8
* <chr> <int> <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr>
1 alabama 1 a b c d e f g h
2 alaska 1 i j k l m n o <NA>
3 arizona 1 p q r s t u v <NA>
我有一个数据集示例需要转换为宽格式,但我有一个特殊问题尚未在 StackOveflow 上得到解决。
我想用来制作长数据集的列的每一行都有唯一值,但我想创建一个新数据集,以便为每个 idvar 的 n 个属性提供 n 个变量。
我需要转换这个:
state sector attribute_value
alabama 1 a
alabama 1 b
alabama 1 c
alabama 1 d
alabama 1 e
alabama 1 f
alabama 1 g
alabama 1 h
alaska 1 i
alaska 1 j
alaska 1 k
alaska 1 l
alaska 1 m
alaska 1 n
alaska 1 o
arizona 1 p
arizona 1 q
arizona 1 r
arizona 1 s
arizona 1 t
arizona 1 u
arizona 1 v
进入:
state sector attribute_value_1 attribute_value_2 attribute_value_3 attribute_value_4 attribute_value_5 attribute_value_6 attribute_value_7 attribute_value_8
alabama 1 a b c d e f g h
alaska 1 i j k l m n o n/a
arizona 1 p q r s t u v n/a
到目前为止,我还不能使用 dcast 或 reshape 来创建这个特定的转换。
试试这个,使用 dplyr
和 splitstackshape
library(dplyr)
library(splitstackshape)
df=df%>%group_by(state,sector)%>%dplyr::summarise(attribute_value=paste(attribute_value,sep=',',collapse = ","))
concat.split(df, 3, drop = TRUE)
state sector attribute_value_1 attribute_value_2 attribute_value_3 attribute_value_4 attribute_value_5 attribute_value_6 attribute_value_7 attribute_value_8
1: alabama 1 a b c d e f g h
2: alaska 1 i j k l m n o NA
3: arizona 1 p q r s t u v NA
与:
library(data.table)
dcast(setDT(df),
state + sector ~ rowid(state, prefix = 'attr_val_'),
value.var = 'attribute_value')
你得到:
state sector attr_val_1 attr_val_2 attr_val_3 attr_val_4 attr_val_5 attr_val_6 attr_val_7 attr_val_8
1: alabama 1 a b c d e f g h
2: alaska 1 i j k l m n o NA
3: arizona 1 p q r s t u v NA
与 dplyr
和 tidyr
。诀窍是设置一个虚拟变量(这里称为 ind
)并使用它来转换为宽格式。
df2 <- df %>% group_by(state, sector) %>%
mutate(ind=paste0("Attribute_", seq_along(attribute_value))) %>%
ungroup() %>%
spread(key=ind, value=attribute_value)
df2
# A tibble: 3 x 10
state sector Attribute_1 Attribute_2 Attribute_3 Attribute_4 Attribute_5 Attribute_6 Attribute_7 Attribute_8
* <chr> <int> <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr>
1 alabama 1 a b c d e f g h
2 alaska 1 i j k l m n o <NA>
3 arizona 1 p q r s t u v <NA>