我有两个数据帧,数据通过"ID"标签连接,如下所示:

test_frame1<- data.frame(
  ID = c("A","B","C"),
  ElementType1 = c(1,6,1),
  ElementType2= c(4,4,5),
  ElementType3 = c('',6,1),
  Notes = c("Something random","","Something else random")
)

test_frame2<-data.frame(
  ID = c("A","A","A","A","A","A","B","B","B","B","B","B","B","B","B","C","C","C","C","C","C","C","C","C"),
  Syllable = c(1,1,2,2,3,3,1,1,1,2,2,2,3,3,3,1,1,1,2,2,2,3,3,3),
  ElementID = c(1,2,1,2,1,2,1,2,3,1,2,3,1,2,3,1,2,3,1,2,3,1,2,3)
)

我想向TEST_Frame2添加一个新列来表示元素类型,如TEST_Frame1中的中间列所述.我希望对每个不同的音节重复这些元素类型,如下所示:

desired_frame<-data.frame(
  ID = c("A","A","A","A","A","A","B","B","B","B","B","B","B","B","B","C","C","C","C","C","C","C","C","C"),
  Syllable = c(1,1,2,2,3,3,1,1,1,2,2,2,3,3,3,1,1,1,2,2,2,3,3,3),
  ElementID = c(1,2,1,2,1,2,1,2,3,1,2,3,1,2,3,1,2,3,1,2,3,1,2,3),
  ElementType= c(1,4,1,4,1,4,6,4,6,6,4,6,6,4,6,1,5,1,1,5,1,1,5,1)
)

我首先调换了TEST_Frame1,使元素类型位于同一列中,ID为列名.然后,我try 将TEST_Frame2分成一个按ID和音节分组的列表.此时,我希望将元素类型列中的值从TEST_Frame1合并、绑定或以其他方式粘贴到该ID对应的列表项中,并将其粘贴到TEST_Frame2中.看起来‘for loop’可能也会对此有所帮助.不过,我正在努力寻找合适的函数来根据列表元素标题的一部分合并一个列表和多个列.有什么简单的方法可以解决这个问题吗?

推荐答案

您可以将test_frame1转换为长格式,然后将left_jointest_frame2转换为结果:

library(tidyverse)

desired_frame <- test_frame2 %>%
  left_join(test_frame1 %>%
    mutate(across(starts_with("Element"), as.numeric)) %>%
    pivot_longer( starts_with("Element"), names_pattern = "(\\d+)",
               names_to = "ElementID", values_to = "ElementType") %>%
    mutate(ElementID = as.numeric(ElementID)), by = c("ID", "ElementID")) %>%
  select(-Notes)

导致

desired_frame
#>    ID Syllable ElementID ElementType
#> 1   A        1         1           1
#> 2   A        1         2           4
#> 3   A        2         1           1
#> 4   A        2         2           4
#> 5   A        3         1           1
#> 6   A        3         2           4
#> 7   B        1         1           6
#> 8   B        1         2           4
#> 9   B        1         3           6
#> 10  B        2         1           6
#> 11  B        2         2           4
#> 12  B        2         3           6
#> 13  B        3         1           6
#> 14  B        3         2           4
#> 15  B        3         3           6
#> 16  C        1         1           1
#> 17  C        1         2           5
#> 18  C        1         3           1
#> 19  C        2         1           1
#> 20  C        2         2           5
#> 21  C        2         3           1
#> 22  C        3         1           1
#> 23  C        3         2           5
#> 24  C        3         3           1

创建于2023-08-01年第reprex v2.0.2

R相关问答推荐

使用scale_x_continuous复制ggplot 2中的离散x轴

如何将在HW上运行的R中的消息(错误、警告等)作为批处理任务输出

根据R中的另一个日期从多列中 Select 最近的日期和相应的结果

如何计算前一行的值,直到达到标准?

用黄土法确定区间

在另一个函数中调用ggplot2美学

如何得到每四个元素向量R?

多个模拟序列间的一种预测回归关系

有效识别长载体中的高/低命中

合并后返回列表的数据帧列表

在保留列表元素属性的同时替换列表元素

悬崖三角洲超大型群数计算导致整数溢出

R如何将列名转换为更好的年和月格式

将列的值乘以在不同数据集中找到的值

网络抓取新闻标题和时间

如何调整一个facet_work()面板内的框图和移动标签之间的水平宽度?

抽样变换-REXP与RWEIBUR

如何创建一个由一个连续变量和一个因素变量组成的复杂方框图?

根据向量对列表元素进行排序

打印的.txt文件,将值显示为&Quot;Num&Quot;而不是值