【问题标题】:How to subset a dataframe based on columns from another dataframe?如何根据来自另一个数据帧的列对数据帧进行子集化?
【发布时间】:2018-11-05 08:59:31
【问题描述】:

我有两个数据框(df1df2),我想根据 df1 中包含的前两列对 df2 进行子集化。例如,

df1 = data.frame(x=c(1,1,1,1,1),y=c(1,2,3,4,5),value=c(3,4,5,6,7))
df2 = data.frame(x=c(1,1,1,1,1,2), y=c(5,3,4,2,1,6), value=c(8,9,10,11,12,13))

如我们所见,df2 中的第 6 行 (2,6) 不包含在df1 中,所以我将只选择 df2 中的第 1 行到第 5 行。

另外,我想根据df1 重新排列df2。最终的结果应该是这样的:

感谢您的帮助。

【问题讨论】:

  • 一种可能的解决方案是df1 %>% select(x,y) %>% inner_join(df2, by=c("x","y"))

标签: r dataframe subset


【解决方案1】:

使用合并时,默认情况下,数据框由它们共有的变量连接,并对结果进行排序。所以你可以这样做:

merge(df2, df1[c('x', 'y')])

#   x y value
# 1 1 1    12
# 2 1 2    11
# 3 1 3     9
# 4 1 4    10
# 5 1 5     8

要按照df1的顺序排序,使用@Mankind_008的方法

merge(df1[c('x','y')], df2 , sort = F)

例子:

set.seed(0)
df1 <- df1[sample(seq_len(nrow(df1))),]
df2 <- df2[sample(seq_len(nrow(df2))),]
df1
#   x y value
# 5 1 5     7
# 2 1 2     4
# 4 1 4     6
# 3 1 3     5
# 1 1 1     3    
merge(df1[c('x','y')], df2 , sort = F)
#   x y value
# 1 1 5     8
# 2 1 2    11
# 3 1 4    10
# 4 1 3     9
# 5 1 1    12

【讨论】:

  • 保持df1的顺序,应该是:merge(df1[c('x','y')], df2 , sort = False)
  • yup 值仅相同,但顺序不同。那是因为 df1 已经在给定的虚拟情况下排序,在一般情况下,即 df1 是原始加扰的,如果 sort = True 则不会保留结构
  • 感谢您的帮助。只需提一下sort=FALSE 应该是正确的格式(而不是False)。
  • @Yang Yang 不客气。你说的对。 Ryan 在回答中添加了同义词“F”。所以不用担心。
【解决方案2】:

使用数据表:

library(data.table)

将您的数据创建为 data.table:

df1 <- data.table( x = c(1,1,1,1,1), y = c(1,2,3,4,5), value = c(3,4,5,6,7) )
df2 <- data.table( x = c(1,1,1,1,1,2), y = c(5,3,4,2,1,6), value = c(8,9,10,11,12,13) )

或者转换你现有的data.frames:

df1 <- as.data.table( df1 )
df2 <- as.data.table( df2 )

然后:

df2[ df1, on = .(x,y) ]

df1 中任何与 df2 同名的列都将重命名为 i.columnname:

   x y value i.value
1: 1 1    12       3
2: 1 2    11       4
3: 1 3     9       5
4: 1 4    10       6
5: 1 5     8       7

请注意,它已经按 x 和 y 排序。如果您想按列“值”(或任何其他)排序:

df2[ df1, on = .(x,y) ][ order(value) ]

使用 data.table(或 dplyr,作为 AntoniosK 提出的解决方案)的优点是您可以将两个数据集分开。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-06-17
    • 1970-01-01
    • 1970-01-01
    • 2017-11-10
    • 2013-06-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多