如何将不同表的不同行合并为一个新表

时间:2016-05-02 15:41:14

标签: r

我得到了data.frame (df).

的这两个表(A和B)

表A

             bb  cc    dd    W   ee   Y
vaccined     12  17.2  15.3  14  5.1  9
no_vaccined  13  7.8   9.7   11  24.9 16
NA           0.3 0.6   1.3   0   0.5  0.7

表B

    bb   cc   dd ee  
no  91.5 90.8 95 87
yes 8.5  9.2  5  13

注意:在表B中,&#39;是&#39;表示以百分比表示属于某个标准的受试者的数量(例如,#34; <5岁&#34;)。 请注意,表B没有&#39; W&#39;也不是&#39; Y&#39;变量

我想将这两个表合并为一个。但是:我只想在新表(C)中添加&#34;是&#34;表B的一行并保持&#34; W&#34;和&#34; Y&#34;表A的变量。

示例:

             bb   cc    dd    W  ee    Y
vaccined     12   17.2  15.3  14  5.1  9
no_vaccined  13   7.8   9.7   11  24.9 16
NA           0.3  0.6   1.3   0   0.5  0.7
yes          8.5  9.2   5     25  13   25.7

有没有办法做到这一点?

任何帮助都会非常有用。

3 个答案:

答案 0 :(得分:2)

如果表B有Yesrows.to.keep<-c("Yes")# you can add more. dfC<-which(rownames(dfB) %in% rows.to.keep) new.df <- rbind(dfA,dfC) 作为行名,您可以执行以下操作

{{1}}

答案 1 :(得分:1)

你可以试试这个:

# sum up W and Y
# and add sum(Y) and sum(W) to B in the same column-order as in table A:
B_new<- cbind(B[, 1:3], W=sum(A$W),ee= B[, 4], Y=sum(A$Y))

rbind(A, B_new[2, ])
              bb   cc   dd  W   ee    Y
vaccined    12.0 17.2 15.3 14  5.1  9.0
no_vaccined 13.0  7.8  9.7 11 24.9 16.0
NA           0.3  0.6  1.3  0  0.5  0.7
yes          8.5  9.2  5.0 25 13.0 25.7

首先,使用Y添加两列Wcbind,将表格B调整为表格A。正如您在预期输出中所示,这些值分别相加。您可以使用sum功能。然后你可以rbind A和B(只有&#34;是&#34;行)。

答案 2 :(得分:0)

如果两个data.frames中没有相同的变量,使用merge比使用rbind更安全:

AB <- merge(A, B[B[, 1] == 'yes', ], all = TRUE)
AB
#           var   bb   cc   dd   ee  W    Y
# 1 no_vaccined 13.0  7.8  9.7 24.9 11 16.0
# 2    vaccined 12.0 17.2 15.3  5.1 14  9.0
# 3         yes  8.5  9.2  5.0 13.0 NA   NA
# 4        <NA>  0.3  0.6  1.3  0.5  0  0.7

您似乎还希望通过插入列总和来为NAW中的Y计算值,您可以这样做:

AB[, -1][is.na(AB[, -1])] <- colSums(AB[, -1][,colSums(is.na(AB[, -1])) > 0], na.rm = TRUE)
AB
#           var   bb   cc   dd   ee  W    Y
# 1 no_vaccined 13.0  7.8  9.7 24.9 11 16.0
# 2    vaccined 12.0 17.2 15.3  5.1 14  9.0
# 3         yes  8.5  9.2  5.0 13.0 25 25.7
# 4        <NA>  0.3  0.6  1.3  0.5  0  0.7

如果我在这里读到的var实际上是行名,你可以删除[, -1]。您还需要将[, 1]中的merge替换为row.names(B)

数据

A <- structure(list(var = structure(c(2L, 1L, NA), .Label = c("no_vaccined", 
    "vaccined"), class = "factor"), bb = c(12, 13, 0.3), cc = c(17.2, 
    7.8, 0.6), dd = c(15.3, 9.7, 1.3), W = c(14L, 11L, 0L), ee = c(5.1, 
    24.9, 0.5), Y = c(9, 16, 0.7)), .Names = c("var", "bb", "cc", 
    "dd", "W", "ee", "Y"), class = "data.frame", row.names = c(NA, 
    -3L))

B <- structure(list(var = structure(1:2, .Label = c("no", "yes"), class = "factor"), 
    bb = c(91.5, 8.5), cc = c(90.8, 9.2), dd = c(95L, 5L), ee = c(87L, 
    13L)), .Names = c("var", "bb", "cc", "dd", "ee"), class = "data.frame", row.names = c(NA, 
    -2L))