【问题标题】:How to transform and include a dataframe in another dataframe如何在另一个数据框中转换和包含数据框
【发布时间】:2016-01-20 06:16:09
【问题描述】:

我还有一个目前无法掌握的棘手任务。它处理 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

到目前为止,我还没有看到诸如合并之类的功能如何提供帮助:合并仅基于两个数据框之间的公共列将 dataframe2 的列添加到 dataframe1。它不会强制 dataframe1 相应地添加行!

【问题讨论】:

  • 好吧,@Thierry 提供的首先将additional 转换为长格式的答案在问题[如何加入(合并)数据帧(内、外、左、右)?]

标签: r dataframe


【解决方案1】:

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

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

【讨论】:

  • 谢谢@Thierry!完美,正是我需要的!
  • @KrisAnathema 这没有给出您在aim 数据集中指定的输出。
  • 是的,几乎是这样。它只是添加了一个 Syllable 列,以及带有 NA 的 SyllOrder。但我可以在之后删除它们!
  • @KrisAnathema 不,请检查所需输出的最后 5 行。它们不在此答案的输出中。
  • 你是对的,但是对于我的实际数据集,这不会发生,因为我对每种歌曲类型都有音节顺序!
【解决方案2】:

要获得所需的输出,您可以:

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")]

作为最后一步的替代方法,您还可以使用:

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

结果:

> aim3
    Male SongNumber SongType Start RecordFile SyllOrder
 1:    1          1      16a   0.5         A1         4
 2:    1          1      16a   0.5         A1         4
 3:    1          1      16a   0.5         A1        84
 4:    1          1      16a   0.5         A1         3
 5:    1          1      16a   0.5         A1        16
 6:    1          1      16a   0.5         A1        16
 7:    1          2      16b  16.1         A1         4
 8:    1          2      16b  16.1         A1         4
 9:    1          2      16b  16.1         A1        84
10:    1          2      16b  16.1         A1         3
11:    1          2      16b  16.1         A1        16
12:    1          2      16b  16.1         A1        16
13:    1          2      16b  16.1         A1        16
14:    1          2      16b  16.1         A1        16
15:    1          2      16b  16.1         A1         3
16:    1          2      16b  16.1         A1         1
17:    1          3      17a  24.2         A1         3
18:    1          3      17a  24.2         A1         3
19:    1          3      17a  24.2         A1         3
20:    1          3      17a  24.2         A1         3
21:    1          3      17a  24.2         A1         3
22:    2          1      24a   0.9         B1        16
23:    2          1      24a   0.9         B1        16
24:    2          1      24a   0.9         B1         3
25:    2          1      24a   0.9         B1        16
26:    2          1      24a   0.9         B1         3
27:    2          1      24a   0.9         B1         4
28:    2          2      24b  10.1         B1        NA
29:    2          3      25d  18.9         B1        NA
30:    2          4      24f   0.7         B2        NA
31:    3          1       5e   0.6         C1        NA
32:    3          2       5e  12.2         C1        NA

【讨论】:

  • 谢谢!它看起来很聪明而且很棒,但是当我在 R 中运行它时收到一条错误消息。这是消息:“[.data.table(setDT(original), additional2, :=(SyllOrder, : 未使用的参数 (on = "歌曲类型")"
  • 你有哪个版本的data.table?您需要 CRAN 的最新版本(即 v1.9.6
  • 我有 v1.9.4 i>!我更新了它,它现在完美地工作。非常感谢!
猜你喜欢
  • 2021-02-18
  • 1970-01-01
  • 2022-08-13
  • 1970-01-01
  • 2020-01-31
  • 1970-01-01
  • 2021-01-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多