【问题标题】:R - pivoting duplicate rows into multiple column with unknown number of columns [duplicate]R - 将重复的行旋转为具有未知列数的多列[重复]
【发布时间】:2020-11-03 15:24:56
【问题描述】:

我有一个这样的数据框:

用这个创建:

companies = c("ABC Ltd", "ABC Ltd", "ABC Ltd", "Derwent plc", "Derwent plc")
sic = c("12345", "24155", "31231", "55346", "34234")

df = data.frame(companies, sic)


如您所见,由于 SIC 代码,公司列是重复的。

我想扩大范围,以便每个 SIC 代码都有自己的列,并且每行只有 1 家公司。

类似下面的内容,我不知道可能有多少列(即可能有一些公司有 20 个 sic 代码)。

我尝试使用 pivot_wider 旋转它,但我无法让它做我需要它做的事情。

非常感谢任何帮助。

【问题讨论】:

  • data.table : dcast(setDT(df), companies~rowid(companies), value.var = 'sic')

标签: r dataframe dplyr tidyr


【解决方案1】:

您可以使用包dplyrtidyr

library(dplyr)
library(tidyr)

df %>% 
  group_by(companies) %>% 
  mutate(row_n = row_number()) %>% 
  pivot_wider(companies, names_from = row_n, values_from = sic, names_glue = "sic.{row_n}")

输出

# A tibble: 2 x 4
# Groups:   companies [2]
#   companies   sic.1 sic.2 sic.3
#   <chr>       <chr> <chr> <chr>
# 1 ABC Ltd     12345 24155 31231
# 2 Derwent plc 55346 34234 NA   

【讨论】:

  • 完美。正是我需要的。非常感谢“Ric S”的快速回复 :)...“names_glue”真的很漂亮!
  • 是的,这是一个很好的功能,可以帮助您根据需要重命名列,而无需在显式步骤中重命名它们
【解决方案2】:

你可以split sic by companies,用1:max(lengths(x))rbind 调用[ 结果。

x <- split(df$sic, df$companies)
do.call(rbind, lapply(x, "[", 1:max(lengths(x))))
#            [,1]    [,2]    [,3]   
#ABC Ltd     "12345" "24155" "31231"
#Derwent plc "55346" "34234" NA     

【讨论】:

  • 谢谢 GKi,非常有帮助!.. 感谢您的快速回复
【解决方案3】:

您遇到了问题,因为还没有一个“时间”变量来区分每个 ID 的度量。您可以使用ave 制作一个并使用reshape

res <- reshape(transform(df, t=ave(companies, companies, FUN=seq)), 
        idvar="companies", timevar="t", direction="wide")
res
#     companies sic.1 sic.2 sic.3
# 1     ABC Ltd 12345 24155 31231
# 4 Derwent plc 55346 34234  <NA>

但是,您可能需要重新考虑关于 ID 测量值彼此对应的数据!

【讨论】:

  • 谢谢 jay.sf,感谢您的快速回复。我同意你的观点。我以前从未见过've'被使用过,今天学到了很多!
猜你喜欢
  • 2016-09-22
  • 2020-11-22
  • 2017-11-18
  • 1970-01-01
  • 1970-01-01
  • 2022-01-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多