所以我有一个包含代码和与这些代码相关联的名称的df。基本上,代码是唯一的,但可能有多个名称。因此,如果您希望在不创建重复行的情况下与另一个表进行left_join()
,则需要重新组织该表。我想让它按代码分组列是"name1", "name2"等。
输入df
df<-data.frame(code=c(1,1,2),
name=c("a", "b", "c"))
结果df
resdf<-data.frame(code=c(1,2),
name1=c("a", "c"),
name2=c("b",""))
我不关心唯一值是用NAs还是"s还是其他什么。
我找不到一个好的解决方案,使用骨料等,我被难住了。
pivot_wider
可以创建一个变量后,标识每个代码的顺序数字。
library(tidyr)
library(dplyr)
df |>
group_by(code) |>
mutate(sequential = row_number()) |>
pivot_wider(names_prefix = "name",
names_from = "sequential",
values_from = "name")
#> # A tibble: 2 × 3
#> # Groups: code [2]
#> code name1 name2
#> <dbl> <chr> <chr>
#> 1 1 a b
#> 2 2 c <NA>
在2022-07-07由reprex包(v2.0.1)创建
如果没有外部包,可以使用reshape()
。
reshape(transform(df, id = ave(code, code, FUN = seq_along)),
direction = "wide", idvar = "code", timevar = "id", v.names = "name")
# code name.1 name.2
# 1 1 a b
# 3 2 c <NA>
另一种基于数据解决问题的方法。表包:
library(data.table)
mx = max(setDT(df)[, .N, code]$N)
df[, setNames(as.list(name)[1:mx], paste0("name", 1:mx)), code]
code name1 name2
1: 1 a b
2: 2 c <NA>