加入具有不同行数和列名的数据 table

Join data table with different number of rows and column names

我有两个表,我想用不同的行数和不同的列名 (FzR/FzL) 连接:

a <- data.frame(FzR = c(130.8616, 130.9943, 131.1719, 131.3771, 131.6092, 131.8660, 132.1437, 132.4384, 132.7980, 133.2867), limb = c("L","L","L","L","L","L","L","L","L","L"), time = c(1.724178, 1.725178, 1.726178, 1.727178, 1.728178, 1.729178, 1.730178, 1.731178, 1.732179, 1.733179))                                                                                      

b <- data.frame(FzL = c(134.8616, 130.9943, 134.1719, 135.3771, 135.6092, 135.8660, 135.1437, 135.4384), limb = c("R","R","R","R","R","R","R","R"), time = c(2.724178, 2.725178, 2.726178, 2.727178, 2.728178, 2.729178, 2.730178, 2.731178))

我想加入这两个表,如下所示:

   Fz          limb         time 
130.8616        L            0
130.9943        L           0.01
131.1719        L           0.02
131.3771        L           0.03
131.6092        L           0.04
131.8660        L           0.05
132.1437        L           0.06
132.4384        L           0.07
132.7980        L           0.08
133.2867        L           0.09
134.8616        R           0.10
130.9943        R           0.11
134.1719        R           0.12
135.3771        R           0.13
135.6092        R            NA
135.8660        R            NA
135.1437        R            NA
135.4384        R            NA

我的 objective 是将 FzR、FzL 和肢体列叠加在一起,从 a 和 b 数据帧中删除“时间”列,并在新数据帧中创建一个新的时间向量,以便根据肢体绘制 Fz 与时间的关系图。

我试过的代码:

rename_1 <- names(a)[names(a) == 'FzR'] <- 'Fz'
rename_2 <- names(b)[names(b) == 'FzL'] <- 'Fz'
rbind(rename_1,rename_2)

我的想法是将 FzR 和 FzL 列名称重命名为通用名称 Fz 以执行 rbind,但这并没有给我正确的输出。任何帮助将不胜感激,谢谢。

你的错误在于双重赋值,因为这样做你只保存了列的名称而你“丢失”了数据:

rename_1 <- names(a)[names(a) == 'FzR'] <- 'Fz'
> rename_1
[1] "Fz"

您只需重命名 a 和 b 的第一列并绑定它们即可:

names(a)[1] = "Fz"
names(b)[1] = "Fz"
res = rbind(a,b)

时间顺序稍后可​​以更改为:

res$time = seq(from=0.01,by=0.01,length.out = nrow(res))

最终结果:

         Fz limb time
1  130.8616    L 0.01
2  130.9943    L 0.02
3  131.1719    L 0.03
4  131.3771    L 0.04
5  131.6092    L 0.05
6  131.8660    L 0.06
7  132.1437    L 0.07
8  132.4384    L 0.08
9  132.7980    L 0.09
10 133.2867    L 0.10
11 134.8616    R 0.11
12 130.9943    R 0.12
13 134.1719    R 0.13
14 135.3771    R 0.14
15 135.6092    R 0.15
16 135.8660    R 0.16
17 135.1437    R 0.17
18 135.4384    R 0.18

(在评论中讨论后编辑)

A dplyr 类似于

library(dplyr)

bind_rows(a, b) %>% 
  mutate(Fz = coalesce(FzR, FzL)) %>% 
  select(Fz, limb, time) %>% 
  group_by(limb) %>% 
  mutate(time = (seq_along(Fz)-1)*0.001)

这样,新创建的变量time将是从0到每个limb的行数的一系列值,乘以一个因子[=16] =](因此它们将是毫秒)。对于 L 和 R 两个肢体,time 将从 0 开始。

输出

# A tibble: 18 x 3
# Groups:   limb [2]
      Fz limb   time
   <dbl> <chr> <dbl>
 1  131. L     0    
 2  131. L     0.001
 3  131. L     0.002
 4  131. L     0.003
 5  132. L     0.004
 6  132. L     0.005
 7  132. L     0.006
 8  132. L     0.007
 9  133. L     0.008
10  133. L     0.009
11  135. R     0    
12  131. R     0.001
13  134. R     0.002
14  135. R     0.003
15  136. R     0.004
16  136. R     0.005
17  135. R     0.006
18  135. R     0.007