从数据帧传输具有匹配字符串的行,而不在R

时间:2017-10-03 02:07:04

标签: r dataframe

在R中,是否可以根据行中是否包含特定列中的相同字符串将行从现有数据帧拉到新数据帧,而不指定该字符串是什么? EG,无论内容是哪一行都匹配某个列,选择这些行并将它们添加到新的数据框中?

插图: 给定两个数据帧

    a1 <- data.frame(a = letters[1:14], b=1:14)
    a2 <- data.frame(a = letters[26:13],b=1:14)

他们在第二列中有两个相同的值:a1 [13,1]&amp; a2 [14,1]是&#34; m&#34;,而a1 [14,1]&amp; a2 [13,1]是&#34; n&#34;。我正在寻找的将输出两个数据帧,例如:

    b1 <- data.frame(a = c("a1","a2"),b = c(a1[13,1],a2[14,1]),c = c(a1[13,2],a2[14,2]))
    b2 <- data.frame(a = c("a1","a2"),b = c(a1[14,1],a2[13,1]),c = c(a1[14,2],a2[13,2]))

这样,在a栏中,将记录从中拉出行的数据帧;在b和c列中,将再现原始数据帧中的两个观察值。

我理解如何使用指定的字符串执行此操作,而不是如何针对非特定匹配字符串执行此操作!如果这是非常基本或多余的,我道歉,这对我来说是非常新的。感谢

1 个答案:

答案 0 :(得分:0)

您可以这样做:

a1 <- data.frame(a = letters[1:14], b=1:14, stringsAsFactors = FALSE)
a2 <- data.frame(a = letters[26:13],b=1:14, stringsAsFactors = FALSE)

# Matching entries in column "a" from dataframes a1 and b2
m <- intersect(a1$a, a2$a);

# Return list of dataframes for every matching element
ret <- lapply(m, function(x) 
    rbind.data.frame(
        c(src = "a1", a1[which(a1$a == x), ]),
        c(src = "a2", a2[which(a2$a == x), ])))
names(ret) <- c("b1", "b2")
ret

#$b1
#  src a  b
#1  a1 m 13
#2  a2 m 14
#
#$b2
#  src a  b
#1  a1 n 14
#2  a2 n 13

提醒您:我无法想到这将是一件有用的事情。也许/可能我没有全面了解。或者你可能需要重新考虑你的方法?

另请注意,如果您希望stringsAsFactors = FALSEb1显示实际匹配字符(而非系数级别),则必须使用b2。在上面的示例中,b1b2的第二列将为您提供因子级别。再一次,不确定你实际上是在追求什么。