R根据列值从两个表中向表中添加列

时间:2014-08-12 19:40:55

标签: r dataframe

我有三张桌子,我试图合并为一张桌子。

主表类似于:

Table1 <- data.frame("Data" = c(1, 2, 3, 4, 5), "Desc" = c("A", "A", "A", "B", "B"))

TableA <- data.frame("Values" = c(6, 2, 3))

TableB <- data.frame("Values" = c(2, 7))

我想使用TableA和TableB中的值向Table1添加另一列,但来自TableA的值必须放在包含&#34; A&#34;的行中。在&#34; Desc&#34;包含&#34; B&#34;的行中的列和TableB值在&#34; Desc&#34;柱。表A中的行数等于Table1与&#34; A&#34;的行数。对于TableB也一样。

结果表应如下所示:

Table1 <- data.frame("Data" = c(1, 2, 3, 4, 5), "Desc" = c("A", "A", "A", "B", "B"), "Values" = c(6, 2, 3, 2, 7))

> Table1
  Data Desc Values
1    1    A      6
2    2    A      2
3    3    A      3
4    4    B      2
5    5    B      7

2 个答案:

答案 0 :(得分:1)

首先请注意,这些是&#34; data.frames&#34;,而不是&#34;表&#34;。 A&#34;表&#34; R实际上是一个不同的类,它们不是同一个东西。这个策略应该有效

Table1$Values <- NA

Table1$Values[Table1$Desc=="A"] <- TableA$Value
Table1$Values[Table1$Desc=="B"] <- TableB$Value

Table1
#   Data Desc Values
# 1    1    A      6
# 2    2    A      2
# 3    3    A      3
# 4    4    B      2
# 5    5    B      7

答案 1 :(得分:0)

如果您有多个表(TableA,TableB,TableC,...等),并且需要将Table.的后缀与Table1Desc匹配

ls1 <- ls(pattern="Table")
ls1
#[1] "Table1" "TableA" "TableB"
library(stringr)
indx <- str_extract(ls1[-1], perl('(?<=Table)[A-Z]'))
lst1 <- mget(ls1[-1])

do.call(rbind,
  lapply(seq_along(lst1),function(i) {
               x1 <- lst1[[i]]
               x2 <- Table1[!is.na(match(Table1$Desc, indx[i])),]
               x2$Values <- x1$Values
               x2}
  ))
 #  Data Desc Values
 #1    1    A      6
 #2    2    A      2
 #3    3    A      3
 #4    4    B      2
 #5    5    B      7
  • 在第一步中,在我创建对象(Table.)后,查找对象名称ls(pattern="Table")
  • 从需要匹配的对象中提取后缀LETTERS AB。使用正则表达式lookbehind,即(?<=Table)[A-Z]匹配字符串Table前面的子字符串(大写字母),并提取子字符串。
  • mget以列表形式返回对象的值
  • 使用lapply循环播放。将Desc中的Table1列与提取的后缀匹配,并创建新列