如何在R中组合未知数量的数据帧?

时间:2015-09-01 20:10:34

标签: r

数据

我有一个数据框df。以下是一个示例:

df <- data.frame(ID = rep(c(-1,7,8), each=3), LV.vel.fps = 40:48, frames = 1:9)

还有未知数量的其他数据帧,每个数据帧都带有前缀“comb”。接下来是一个数字。这些数据帧中的每一个代表车辆的数据。以下数据框包含这些车辆的名称(这些数字根据实验而变化,现在有2辆车,但经过另一次实验后可能有9辆):

> ADO.names
       name
1 TrucPropk
2     Truck

因此,nrow(ADO.names)告诉我们有多少数据帧。以下是“梳子”。此特定示例的数据框:

comb.1 <- data.frame(frames = 4:6, ADO.name = "TrucPropk", speed.fps = 43:45)
comb.2 <- data.frame(frames = 7:9, ADO.name = "Truck", speed.fps = 46:48)

此外,这些数据框可能有不同的行数。

我想做什么

df中的“ID”变量包含“梳子”中车辆的ID。数据帧。 -1表示没有车辆。这些ID在“梳子”中不可用。数据框但我想在df中添加一个新列“final.name”,其中包含给定ID的车辆名称。这可以通过匹配“梳子”中的“speed.fps”来完成。到df中的“LV.vel.fps”因为两者都是以每秒英尺为单位的速度。 因此,最终输出应如下所示:

> df
  ID LV.vel.fps frames final.name
1 -1         40      1         NA
2 -1         41      2         NA
3 -1         42      3         NA
4  7         43      4  TrucPropk
5  7         44      5  TrucPropk
6  7         45      6  TrucPropk
7  8         46      7      Truck
8  8         47      8      Truck
9  8         48      9      Truck

问题

对于这些示例数据框,我可以执行以下操作来加入数据框:

library(dplyr)
df <- df %>% 
  left_join(x = ., y = comb.1, by = "frames") %>% 
  left_join(x = ., y = comb.2, by = "frames")

ifelse代表“final.name”:

df$final.name <- ifelse(df$speed.fps.x==df$LV.vel.fps,
                        df$ADO.name.x,
                        ifelse(df$speed.fps.y==df$LV.vel.fps,
                               df$ADO.name.y, "NA"))

但我得到的输出是错误的:

> df
  ID LV.vel.fps frames final.name ADO.name.x speed.fps.x ADO.name.y speed.fps.y
1 -1         40      1         NA       <NA>          NA       <NA>          NA
2 -1         41      2         NA       <NA>          NA       <NA>          NA
3 -1         42      3         NA       <NA>          NA       <NA>          NA
4  7         43      4          1  TrucPropk          43       <NA>          NA
5  7         44      5          1  TrucPropk          44       <NA>          NA
6  7         45      6          1  TrucPropk          45       <NA>          NA
7  8         46      7         NA       <NA>          NA      Truck          46
8  8         47      8         NA       <NA>          NA      Truck          47
9  8         48      9         NA       <NA>          NA      Truck          48

问题

基本上我有两个问题:
1)如何编写代码以便所有“梳理”。无论这些数据帧的数量是多少,数据框都与df连接在一起?我知道在这种情况下有2个,所以手动写了“comb.1”和“comb.2”但是代码应该对任意数量的数据帧都是健壮的。
2)为什么我的ifelse语句没有生成正确的输出?我怎么能为这种情况编写健壮的代码呢?

1 个答案:

答案 0 :(得分:6)

我们可以使用comblist mget元素然后{{{}获取rbind中以list开头的data.frame对象名称1}}使用数据集&#39; df&#39;。

merge

编辑:正如OP提到的那样,匹配速度&#39;列,我们也可以在res <- merge(df, do.call(rbind, mget(ls(pattern='^comb\\.\\d+')))[1:2], by='frames', all.x=TRUE) colnames(res)[4] <- 'final.name' res # frames ID LV.vel.fps final.name #1 1 -1 40 <NA> #2 2 -1 41 <NA> #3 3 -1 42 <NA> #4 4 7 43 TrucPropk #5 5 7 44 TrucPropk #6 6 7 45 TrucPropk #7 7 8 46 Truck #8 8 8 47 Truck #9 9 8 48 Truck

中包含这些列
merge