【问题标题】:Subset data frame within a for loopfor循环中的子集数据框
【发布时间】:2021-06-21 16:31:06
【问题描述】:

抱歉,如果这个问题是重复的/非常基本的,但我找不到任何可以回答我的具体问题的东西。我有一个包含多个变量的数据框,我想根据每列中的信息对其进行子集化,并为每个变量创建新的数据框。示例数据如下。 数据:

Column I Want var1 var2 var3
A             NA   NA   Y
B             Y    NA   NA
C             NA   NA   NA
D             Y    Y    NA
E             Y    NA   Y
F             NA   Y    Y 
G             NA   NA   Y 

最后,我希望每一列都有单独的数据框,如下所示: 变量1:

Column I Want
B
D
E

var2:

Column I Want
D
F

var3:

Column I Want
A
E
F
G

这是我的代码:

names <- names(data)
for (i in 1:length(names)) {
  assign(names[i], subset(data, names[i] == "Y", select = "Column I Want"))
}

这将为我提供三个单独的数据框,其中包含我想要的列,但是,每个数据框中有 0 个观察值。我怀疑'names[i] == "Y"' 部分我做错了,但我不太明白。任何人都可以提供一个简单的答案吗?谢谢!

【问题讨论】:

    标签: r loops subset


    【解决方案1】:

    不要使用assign,而是使用list

    # for loop approach
    results = list()
    for(nm in names(data)[-1]) { # omit the first column
      results[[nm]] = data[data[[nm]] %in% "Y", "Column I want", drop = FALSE]
    }
    
    # lapply approach
    results = lapply(data[-1], function(col) data[col %in% "Y", "Column I want", drop = FALSE])
    

    drop = FALSE 参数确保您获得 1 列数据帧,而不是向量。

    至于你方法中的问题,names[i] 只是一个字符串,所以你正在测试,比如说,"var2" == "Y",这是错误的。

    【讨论】:

    • 谢谢!为了简单起见,我最终使用了 lapply 方法,并将整个内容包装在 list2env() 中以创建单独的数据框(我的进一步分析要求它们是单独的,而不是列表的一部分)。这是我的最终解决方案:list2env(lapply(data[-1], function(col) data[col == "Y", "Column I Want", drop = FALSE]),.GlobalEnv)
    • @Gregor Thomas 你在function之前漏掉了一个逗号
    • 谢谢@ChrissPaul!
    【解决方案2】:

    另一种选择可能是:

    df <- read.table(header = TRUE, text =
    "Column var1 var2 var3
    A             NA   NA   Y
    B             Y    NA   NA
    C             NA   NA   NA
    D             Y    Y    NA
    E             Y    NA   Y
    F             NA   Y    Y 
    G             NA   NA   Y" )
    
    lapply(df[,-1], function(x) df$Column[x=="Y" &!is.na(x)])
    $var1
    [1] "B" "D" "E"
    
    $var2
    [1] "D" "F"
    
    $var3
    [1] "A" "E" "F" "G"
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-08-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-02
      • 2018-06-21
      • 1970-01-01
      • 2021-04-26
      相关资源
      最近更新 更多