r - 在 r 中将 2 列(从长形式转换为宽形式)扩展为 4 列

标签 r dplyr tidyr

我有这种形式的数据

id  year    facname class_code       line_no    value
1     1         A        County           1      county1
1     1         A        County           2      county2
1     1         A        source1          1      9
1     1         A        source1          2      4
1     1         A        source2          1      7
1     1         A        source2          2      2
1     1         A        source3          1      8...

2     1         B        County           1      county1
2     1         B        County           2      county1
2     1         B        source1          1      21
2     1         B        source1          2      9
2     1         B        source2          1      4
2     1         B        source2          2      7 ....

我正在尝试将其转换成类似这样的内容: (请注意,最后 3 列的值将相应地“展开”)

id year facname   line_no        County      source1        source2      source3
1   1    A       1               county1      9                7           8      
1   2    A       2               county2      4                2           NA
1   3    A       3               county3             
1   4    A       4               county4
2   1    B       1               county1
2   2    B       2               county2
2   3    B       3               county3
2   4    B       4               county4 

这将显示不同数量的付款人 (source1,source2, source3) 和县所属的县名称 (county1, county2)。 我知道它是传播(也可能是聚集)的某种组合,但我无法理解它。

感谢任何帮助,谢谢!
(PS:我知道这可能是一个重复的问题,但我对整理数据真的很陌生)

编辑:县(county1、2..等)实际上是数字(在原始数据集中)但本质上是分类的,所以我称它们为 county1,其他值(来源)实际上是该县参加事件的人(来源 1、来源 2 等)。每个设施总共有 40 个 line_no。

最佳答案

一个选项是使用双 tidyr::spread 作为:

更新:基于@CJYetman 的评论

library(dplyr)
library(tidyr)

# Just spread can transform and work on present sample data used by OP
df %>% spread(class_code, value)

#The complicated version below based was initially used to handle different
#line numbers for rows with "County" and rows without "County"
filter(df, class_code == "County") %>% spread(class_code, value) %>% 
left_join(filter(df, class_code != "County") %>% spread(class_code, value),
  by=c("id", "line_no", "facname")) 

#   id facname line_no  County source1 source2 source3
# 1  1       A       1 county1       9       7       8
# 2  1       A       2 county2       4       2    <NA>
# 3  2       B       1 county1      21       4    <NA>
# 4  2       B       2 county1       9       7    <NA>

数据:

df <- read.table(text = 
"id  facname class_code       line_no    value
1   A        County           1      county1
1   A        County           2      county2
1   A        source1          1      9
1   A        source1          2      4
1   A        source2          1      7
1   A        source2          2      2
1   A        source3          1      8
2   B        County           1      county1
2   B        County           2      county1
2   B        source1          1      21
2   B        source1          2      9
2   B        source2          1      4
2   B        source2          2      7",
header = TRUE, stringsAsFactors = FALSE)

关于r - 在 r 中将 2 列(从长形式转换为宽形式)扩展为 4 列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49822968/

相关文章:

r - 如何以编程方式设置 tibble 列类型

r - 如何获得 R 帮助?

r - 将句子的每个单词大写,除了第一个字母

r - 根据列的每个值所属列表的类别对它们进行分组

r - 如何清理调查数据?

r - 使用 dplyr 和 group_by,有没有办法引用原始(完整)数据集?

R:如何拟合具有分布组合的大型数据集?

r - 使用列向量索引多维表

r - 使用 dplyr 中的超前和滞后来获取向量内的差分值

r - 根据日期之间的等级逐行选择值