【问题标题】:R: Making subsetting of rows of a data.frame based on another data.frame independentR:根据另一个data.frame独立对data.frame的行进行子集化
【发布时间】:2014-10-21 14:17:05
【问题描述】:

我有一个带有示例数据的input data.frame

input <- structure(list(NAME = structure(c(3L, 7L, 6L, 4L, 2L, 5L, 1L), .Label = c("Example2","Example7", "Test", "Test2", "Test3", "Test6", "Test77"), class = "factor"), REFERENCE = structure(c(2L, 3L, 1L, 1L, 4L, 2L, 1L), .Label = c("EXAMPLE5", "REGION1", "REGION2", "REGION77"), class = "factor"), VALUE = structure(c(1L,2L, 3L, 4L, 6L, 5L, 7L), .Label = c("120", "13", "14", "65", "89", "B", "C"), class = "factor")), .Names = c("NAME", "REFERENCE", "VALUE"), class = "data.frame", row.names = c(NA, -7L))
      NAME REFERENCE VALUE
1     Test   REGION1   120
2   Test77   REGION2    13
3    Test6  EXAMPLE5    14
4    Test2  EXAMPLE5    65
5 Example7  REGION77     B
6    Test3   REGION1    89
7 Example2  EXAMPLE5     C

我还有第二个 data.frame filelist,其中的数据是这样排序的。

filelist <- structure(list(NAME = structure(c(3L, 5L, 1L, 6L, 4L, 2L), .Label = c("","Example2", "Test", "Test2", "Test3", "Test6"), class = "factor"), REFERENCE = structure(c(3L, 3L, 1L, 2L, 2L, 2L), .Label = c("",  "EXAMPLE5", "REGION1"), class = "factor")), .Names = c("NAME","REFERENCE"), class = "data.frame", row.names = c(NA, -6L))
          NAME REFERENCE
    1     Test   REGION1
    2    Test3   REGION1
    3                   
    4    Test6  EXAMPLE5
    5    Test2  EXAMPLE5
    6 Example2  EXAMPLE5

filelist 包含应写入单独 data.frames 的所有值,这些值按 REFERENCE 列分组(如下面的代码所示)。 到目前为止,我通过使用下面的代码并手动对列进行子集化然后将它们绑定在一起来做到这一点。有没有办法可以独立完成?

# Manual selection REGION1
Test <- subset(input, NAME=="Test")
Test3 <- subset(input, NAME=="Test3")
# rbind them together
REGION1 <- rbind(Test, Test3)

# Manual selection EXAMPLE5
Test6 <- subset(input, NAME=="Test6")
Test2 <- subset(input, NAME=="Test2")
Example2 <- subset(input, NAME=="Example2")
# rbind them together
EXAMPLE5 <- rbind(Test6, Test2,Example2)

【问题讨论】:

    标签: r subset rbind


    【解决方案1】:

    这可能会有所帮助,并且您所追求的。您似乎想合并输入和文件列表。然后,您要为每个级别的 REFERENCE 创建一个数据框。

    library(dplyr)
    
    ana <- filelist %>%
                left_join(., input)
    
    split(ana, f = ana$REFERENCE )
    
    #[[1]]
    #  NAME REFERENCE VALUE
    #3                 <NA>
    
    #$EXAMPLE5
    #      NAME REFERENCE VALUE
    #4    Test6  EXAMPLE5    14
    #5    Test2  EXAMPLE5    65
    #6 Example2  EXAMPLE5     C
    
    #$REGION1
    #   NAME REFERENCE VALUE
    #1  Test   REGION1   120
    #2 Test3   REGION1    89
    

    编辑

    非常感谢@Richard Scriven。这是 OP 想要的最后一步。

    list2env(split(ana, f = ana$REFERENCE )[-1], .GlobalEnv)
    
    #> EXAMPLE5
    #      NAME REFERENCE VALUE
    #4    Test6  EXAMPLE5    14
    #5    Test2  EXAMPLE5    65
    #6 Example2  EXAMPLE5     C
    

    【讨论】:

    • 太棒了!如何将此列表转换为多个 data.frame?
    • @redshoe 你可以使用list2env(split(ana, f = ana$REFERENCE )[-1], .GlobalEnv) 然后你有EXAMPLE5REGION1 作为全球环境中的数据框
    • @RichardScriven 非常感谢您。我刚刚在google group上发现了一个帖子。另一个很好的学习机会。谢谢。
    • @redshoe 很高兴这对你有用。部分功劳归功于@Richard Scriven。我从中学到了list2env
    猜你喜欢
    • 1970-01-01
    • 2012-04-04
    • 1970-01-01
    • 1970-01-01
    • 2011-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多