我目前正在处理一个数据项目,需要压缩数据,以便数据框中的名称不重复.问题是名称在数据框中重复,因 for each 名称可以有多个ID代码.下面我附上了一个样本数据框架:

df_have <- data.frame(
  Name = c("Maya", "Maya", "Sierra", "Sophia", "Sophia", 
           "Sophia", "Cecilia", "Cecilia"),
  ID = c(24, 56, 54, 12, 15, 24, 12, 11)
)

df_have
#>      Name ID
#> 1    Maya 24
#> 2    Maya 56
#> 3  Sierra 54
#> 4  Sophia 12
#> 5  Sophia 15
#> 6  Sophia 24
#> 7 Cecilia 12
#> 8 Cecilia 11

下面是转换为所需格式的示例:

df_want <- data.frame(
  Name = c("Maya", "Sierra", "Sophia", "Cecilia"),
  ID1 = c(24, 54, 12, 12),
  ID2 = c(56, 0, 15, 11),
  ID3 = c(0, 0, 24, 0)
)

df_want
#>      Name ID1 ID2 ID3
#> 1    Maya  24  56   0
#> 2  Sierra  54   0   0
#> 3  Sophia  12  15  24

我正在使用R来转换数据.我try 过PIVOT_WIDTER命令,但只能使用它将数据转换为数据框,其中列"ID"中的值成为列名,而这些列中的值是虚拟变量,用于确定名称是否具有相应的ID号.这不是所希望的,因为ID代码太多,无法使数据可用(上面的数据只是一个示例).此外,它没有解决同名多行的问题,因为它只是增加了数据框的宽度,而没有对其进行压缩.

推荐答案

像这样吗?首先给出长数据帧中有效ID的总数为idno,然后使用这些数字创建唯一列:

library(tidyverse)

ids <- read_table("
            Name ID
            Maya 24
            Maya 56
            Sierra 54
            Sophia 12
            Sophia 15
            Sophia 24
            Cecilia 12
            Cecilia 11")

ids |>
  mutate(idno = row_number(), .by = Name) |>
  pivot_wider(
    values_from = ID,
    names_from = idno,
    values_fill = 0,
    names_prefix = "ID"
  )
#> # A tibble: 4 × 4
#>   Name      ID1   ID2   ID3
#>   <chr>   <dbl> <dbl> <dbl>
#> 1 Maya       24    56     0
#> 2 Sierra     54     0     0
#> 3 Sophia     12    15    24
#> 4 Cecilia    12    11     0

R相关问答推荐

在特定列上滞后n行,同时扩展框架的长度

如何替换R中数据集列中的各种字符串

带有gplot 2的十字舱口

为什么st_join(ob1,ob2,left = True)返回具有比ob1更多功能的sf对象?

r—绘制相交曲线

任意列的欧几里得距离

根据模式将一列拆分为多列,并在R中进行拆分

迭代通过1个长度的字符串长字符R

如何在格子中添加双曲曲线

将数据集中的值增加到当前包含的最大值

如何在R forestplot中为多条垂直线分配唯一的 colored颜色 ?

跨列查找多个时间报告

将箭头绘制在图形外部,而不是图形内部

创建列并对大型数据集中的特定条件进行成对比较的更高效程序

按组内中位数分类

是否有一个R函数可以输出在输入的字符向量中找到的相应正则表达式模式?

如何使用grepl()在数据帧列表中 Select 特定字符串?

为什么在POSIXct-times的向量上循环会改变R中的类型?

真实世界坐标的逆st_变换

以列名的字符向量作为参数按行应用自定义函数