我有一个数据框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
语句没有生成正确的输出?我怎么能为这种情况编写健壮的代码呢?
答案 0 :(得分:6)
我们可以使用comb
,list
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