我有三张桌子,我试图合并为一张桌子。
主表类似于:
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
答案 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.
的后缀与Table1
列Desc
匹配
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")
A
,B
。使用正则表达式lookbehind
,即(?<=Table)[A-Z]
匹配字符串Table
前面的子字符串(大写字母),并提取子字符串。mget
以列表形式返回对象的值lapply
循环播放。将Desc
中的Table1
列与提取的后缀匹配,并创建新列