将值从宽变长:1)Group_By,2)传播/播出 [英] Changing Values from Wide to Long: 1) Group_By, 2) Spread/Dcast
问题描述
我有一个电话号码的名称列表,我想按名称分组,然后将它们从长格式转换为宽格式,并在各列中填充电话号码
I've got a list of names of phone numbers, which I want to group by name, and bring them from a long format to a wide one, with the phone number filling across the columns
Name Phone_Number
John Doe 0123456
John Doe 0123457
John Doe 0123458
Jim Doe 0123459
Jim Doe 0123450
Jane Doe 0123451
Jill Doe 0123457
Name Phone_Number1 Phone_Number2 Phone_Number3
John Doe 0123456 0123457 0123458
Jim Doe 0123459 0123450 NA
Jane Doe 0123451 NA NA
Jill Doe NA NA NA
library(dplyr)
library(tidyr)
library(data.table)
df <- data.frame(Name = c("John Doe", "John Doe", "John Doe", "Jim Doe", "Jim Doe", "Jane Doe", "Jill Doe" ),
Phone_Number = c("0123456", "0123457","0123458", "0123459", "0123450","0123451", NA))
df1 <- data.frame(Name = c("John Doe","Jim Doe", "Jane Doe", "Jill Doe" ),
Phone_Number1 = c("0123456", "0123459", "0123451", NA),
Phone_Number2 = c("0123457", "0123450", NA, NA),
Phone_Number3 = c("0123458", NA, NA, NA))
我尝试了一系列排列,但是我做错的只是没有点击.我猜想这与如何正确指定它们的键/值对有关.我最接近的是带有以下代码的:
I've tried a range of permutations, but what I'm doing wrong just isn't clicking. I'm guessing it's to do with how to specify they key/value pairs properly. The closest I've got is the with the code below:
tidyr :: spread
df %>%
group_by(Name) %>%
mutate(id = row_number()) %>%
spread(Name, Phone_Number) %>%
select(-id)
data.table :: dcast
df%>%
dcast(Name + Phone_Number ~ Phone_Number, value.var = "Phone_Number")
推荐答案
您不想添加行号(整个数据的索引),而是使用辅助函数 n()添加组索引.
,代表 grouped_df
中每个组中的观测值数量.然后散布应该顺利进行...
You don't want to add a row number (index for the whole data) but instead add the group index with the helper function n()
, which represents the number of observations in each group in a grouped_df
. Then the spreading should go smoothly...
df %>% group_by(Name) %>%
mutate(group_index = 1:n() %>% paste0("phone_", .)) %>%
spread(group_index, Phone_Number)
# A tibble: 4 x 4
# Groups: Name [4]
Name phone_1 phone_2 phone_3
<fctr> <fctr> <fctr> <fctr>
1 Jane Doe 0123451 <NA> <NA>
2 Jill Doe <NA> <NA> <NA>
3 Jim Doe 0123459 0123450 <NA>
4 John Doe 0123456 0123457 0123458
这篇关于将值从宽变长:1)Group_By,2)传播/播出的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!