R函数用于将数据转置为新列

3

我有一个问题一直在尝试解决...它让我发疯了。基本上,我的数据为每个附加的“注释”生成重复行,而不是将注释按新列排序。基本上,我需要这样做:

ID 公司 注释1 注释2 注释3
1 srental skiing rentals last used 3/12/14
2 hertz car rental
3 nike shoe orders last used 2/14/19 www.nike.com

转化为这个:

编号 公司 备注1 备注2 备注3
1 srental 滑雪租赁 最后使用日期为3/12/14
2 hertz 汽车租赁
3 nike 鞋类订单 最后使用日期为2/14/19 www.nike.com

我已经尝试了几次但都失败了。以下是我最接近的尝试:

将数据从长格式转换为宽格式

data2 <- pivot_wider(data, names_from = Note, values_from = Note, names_prefix = "Note_")

将列重命名以删除“Note_”前缀

colnames(data2) <- gsub("Note_", "", seq(col(data2)))
names(data2)[names(data2) == "1"] <- "ID"
names(data2)[names(data2) == "2"] <- "Company"

打印最终结果

data2

最终结果

非常感谢任何帮助!


首先,为每个(id,company)创建一个id_note,即 data <- group_by(data, id, company) |> mutate(id_note = 1:n())。 然后使用id_note作为names_from进行pivot_wider。 - Ric
1个回答

4

按组使用row_number(),然后进行透视宽化:

pivot_wider(
  data %>% group_by(Company) %>% mutate(i=row_number()),
  names_from=i,
  values_from=Note,
  names_prefix = "Note "
)

输出:

     ID Company `Note 1`       `Note 2`          `Note 3`    
  <int> <chr>   <chr>          <chr>             <chr>       
1     1 srental skiing rentals last used 3/12/14 NA          
2     2 hertz   car rental     NA                NA          
3     3 nike    shoe orders    last used 2/14/19 www.nike.com

根据@jpsmith的建议,这是一个更简洁的替代方案:

pivot_wider(
  mutate(data, i=paste("Note",row_number()), .by=Company),
  names_from=i,
  values_from=Note,
)

2
很棒的解决方案!对于最新版本的 dplyr,可以简化为 data %>% mutate(i = row_number(), .by = Company) - jpsmith
1
谢谢@jpsmith,我需要加油!!! :) - langtang

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接