r语言 - 创建同义词表



所以我有一个包含代码和与这些代码相关联的名称的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>

相关内容

  • 没有找到相关文章

最新更新