【问题标题】:R loop over dataframe to create new dataframesR循环遍历数据框以创建新的数据框
【发布时间】:2014-09-06 06:40:42
【问题描述】:

假设我有几个数据框

dfx01=data.frame(city=c("a","b","c","d"),yr=c(2000,2001,2003,2002))
dfx02=data.frame(city=c("a","e","c","d"),yr=c(2000,2001,2005,2002))
dfx012=data.frame(city=c("f","b","c","d"),yr=c(2000,2000,2001,2002))
dfx022=data.frame(city=c("f","b","c","g"),yr=c(2002,2000,2003,2001))

我应该如何输出仅子集 yr=2001 的相应数据帧 x01,x02,x012,x022?

我尝试过应用

dflist=list(dfx01,dfx02,dfx012,dfx022)
lapply(dflist, fun(x){subset(x,startyr=2000)})

但是如何命名 4 个新数据框 x01,x02,x012,x022?谢谢。

【问题讨论】:

    标签: r loops dataframe lapply


    【解决方案1】:

    您的通话只需稍作改动即可。试试

    lapply(dflist, subset, yr == 2000)
    

    但我更喜欢 [ 子集,因为 subset 可能会产生意想不到的结果。以下是如何做到这一点,并同时添加新名称。要设置与您的数据框名称相似的名称,最好先将名称添加到列表中。

    > dflist <- setNames(dflist, grep("dfx0", ls(), value = TRUE))
    > setNames(lapply(dflist, function(x) x[x$yr==2001, ]), 
                      gsub("df", "", names(dflist)))
    # $x01
    #   city   yr
    # 2    b 2001
    # 
    # $x012
    #   city   yr
    # 2    e 2001
    # 
    # $x02
    #   city   yr
    # 3    c 2001
    # 
    # $x022
    #   city   yr
    # 4    g 2001
    

    【讨论】:

    • 谢谢,这很好用。另一个问题是,我不想将输出命名为 df1-4,而是使用原始名称的最后几个字符,例如 dfx01,如果新的 df 命名为 x01,那就太好了。我该怎么做?
    • subset 会得到什么样的意外结果?
    • 非常感谢! @理查德斯克里文
    • 还有,如何使输出 4 df 而不是列表的一部分?
    • 从列表结果中,使用list2env(result, .GlobalEnv)
    猜你喜欢
    • 2020-03-29
    • 2020-04-06
    • 1970-01-01
    • 2021-03-31
    • 2019-08-26
    • 2018-09-28
    • 2018-12-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多