R 如何在另一个数据帧中转换和包含一个数据帧

R 如何在另一个数据帧中转换和包含一个数据帧,r,dataframe,R,Dataframe,我还有一项棘手的任务,目前还不能掌握。它处理R中的数据帧 假设我有一个数据框,看起来像: original = data.frame(Male = c(rep(1,3),rep(2,4),rep(3,2)), SongNumber = c(1,2,3,1,2,3,4,1,2), SongType = c("16a","16b","17a","24a","24b","25d","24f","5e","5e"),

我还有一项棘手的任务,目前还不能掌握。它处理R中的数据帧

假设我有一个数据框,看起来像:

original = data.frame(Male = c(rep(1,3),rep(2,4),rep(3,2)),
                  SongNumber = c(1,2,3,1,2,3,4,1,2),
                  SongType = c("16a","16b","17a","24a","24b","25d","24f","5e","5e"),
                  Start = c(0.5,16.1,24.2,0.9,10.1,18.9,0.7,0.6,12.2),
                  RecordFile = c(rep("A1",3),rep("B1",3),"B2",rep("C1",2)))
original
以及另一数据帧,其包含每种歌曲类型的特定音节顺序:

additional = data.frame(SongType = c("16a","16b","17a","24a"),
                    Syll1 = c(4,4,3,16),
                    Syll2 = c(4,4,3,16),
                    Syll3 = c(84,84,3,3),
                    Syll4 = c(3,3,3,16),
                    Syll5 = c(16,16,3,3),
                    Syll6 = c(16,16,NA,4),
                    Syll7 = c(NA,16,NA,NA),
                    Syll8 = c(NA,16,NA,NA),
                    Syll9 = c(NA,3,NA,NA),
                    Syll10 = c(NA,1,NA,NA))
additional
我现在想在前面的数据框中插入音节顺序作为一列。最终结果应如下所示:

aim = data.frame(Male = c(rep(1,21),rep(2,9),rep(3,2)),
             SongNumber = c(rep(1,6),rep(2,10),rep(3,5),rep(1,6),2,3,4,1,2),
             SongType = c(rep("16a",6),rep("16b",10),rep("17a",5),rep("24a",6),"24b","25d",
                          "24f","5e","5e"),
             Start = c(rep(0.5,6),rep(16.1,10),rep(24.2,5),rep(0.9,6),10.1,18.9,0.7,0.6,
                       12.2),
             RecordFile = c(rep("A1",21),rep("B1",8),"B2",rep("C1",2)),
             SyllOrder = c(4,4,84,3,16,16,4,4,84,3,16,16,16,16,3,1,3,3,3,3,3,16,16,3,16,3,4,
                           NA,NA,NA,NA,NA))
aim

到目前为止,我看不到诸如merge之类的函数有什么帮助:merge仅基于两个数据帧之间的公共列将dataframe2的列添加到dataframe1。它不会强制dataframe1相应地添加行

您需要将
附加的
转换为长格式。然后你可以合并它们

library(dplyr)
library(tidyr)
additional %>% 
  gather("Syllable", "SyllOrder", -SongType) %>% 
  inner_join(original, by = "SongType")

您需要将
附加的
转换为长格式。然后你可以合并它们

library(dplyr)
library(tidyr)
additional %>% 
  gather("Syllable", "SyllOrder", -SongType) %>% 
  inner_join(original, by = "SongType")

要获得所需的输出,可以执行以下操作:

library(data.table)
additional2 <- melt(setDT(additional), id="SongType", na.rm=TRUE)[, .(SyllOrder = toString(value)), by = SongType]

aim2 <- setDT(original)[additional2, SyllOrder := i.SyllOrder, on="SongType"
                        ][, lapply(.SD, function(x) unlist(tstrsplit(x, ",", fixed=TRUE))),
                          by=setdiff(names(original),"SyllOrder")]

要获得所需的输出,可以执行以下操作:

library(data.table)
additional2 <- melt(setDT(additional), id="SongType", na.rm=TRUE)[, .(SyllOrder = toString(value)), by = SongType]

aim2 <- setDT(original)[additional2, SyllOrder := i.SyllOrder, on="SongType"
                        ][, lapply(.SD, function(x) unlist(tstrsplit(x, ",", fixed=TRUE))),
                          by=setdiff(names(original),"SyllOrder")]

谢谢@Thierry!完美,正是我所需要的@KrisAnathema这并没有给出您在
aim
数据集中指定的输出。是的,它几乎是这样。它只添加了一个列音节,SyllOrder和NA。但是我可以在以后把它们移除@KrisAnathema否,检查所需输出的最后5行。答案的输出中没有它们。你是对的,但对于我的实际数据集,这不会发生,因为我对每种歌曲类型都有音节顺序!谢谢@Thierry!完美,正是我所需要的@KrisAnathema这并没有给出您在
aim
数据集中指定的输出。是的,它几乎是这样。它只添加了一个列音节,SyllOrder和NA。但是我可以在以后把它们移除@KrisAnathema否,检查所需输出的最后5行。答案的输出中没有它们。你是对的,但对于我的实际数据集,这不会发生,因为我对每种歌曲类型都有音节顺序!嗯,@Thierry提供的第一次将
附加
转换为长格式的答案在问题[如何连接(合并)数据帧(内部、外部、左侧、右侧)?]中找不到@Thierry提供的第一次将
附加
转换为长格式的答案在问题[如何连接]中找不到(合并)数据帧(内部、外部、左侧、右侧)?]谢谢!它看起来很聪明也很棒,但是当我在R中运行它时,我收到一条错误消息。下面是消息:“错误在
[.data.table
(setDT(original),additional2,
:=
(Syllower,:unused argument(on=“SongType”)”你有哪个版本的
data.table
吗?你需要CRAN的最新版本(即v1.9.6)。我有v1.9.4!我更新了它,现在它工作得很好。非常感谢!谢谢!它看起来很聪明很好,但是当我在R中运行它时,我收到了一条错误消息。下面是消息:“error in
[.data.table
(原始),additional2,
:=
(SyllOrder,:unused argument(on=“SongType”)“您有哪个版本的
数据表呢?您需要来自CRAN的最新版本(即v1.9.6)。我有v1.9.4!我更新了它,现在它工作得很好。非常感谢!