R:基于行过滤器创建多个数据框

时间:2020-04-30 06:02:13

标签: r

我有一个数据框(df),如下所示:

  Date           Group       Value
01-04-2029      Saffron      62.78
01-04-2029      Green        75.65
01-05-2019      Saffron      67.89
01-06-2019      Saffron      54.56
01-06-2019      Green        77.00
01-07-2019      Green        71.22

目标:我想基于Group创建两个单独的数据帧。本质上,我正在寻找以下内容

df_saffron: 
    Date           Group       Value
01-04-2029        Saffron      62.78
01-05-2019        Saffron      67.89
01-06-2019        Saffron      54.56

df_green:
   Date           Group        Value
01-04-2029        Green        75.65
01-06-2019        Green        77.00
01-07-2019        Green        71.22

具体来说,如果我使用以下代码段(this thread

for(i in unique(as.character(df$Group))) {
    nam <- paste("df", i, sep = ".")
    assign(nam, df[df$Group==i,])
    }

我没有得到任何数据帧,例如df.Greendf.Saffron。我的意思是

<0 rows> (or 0 -length row.names) 

我也看过this SO线程,但是出现错误。

Error in assign(as.character(v, data %>% filter(data$Group == v), envir = .GlobalEnv)) :
argument "value" is missing, with no default
In addition: Warning message:
In data.matrix(data) : NAs introduced by coercion

我是R的新手,因此想知道我错过了什么地方的任何线索吗?

3 个答案:

答案 0 :(得分:3)

使用split

list_data <- split(df, df$Group)

如果需要单独的数据框,这将为您提供数据框列表。

names(list_data) <- paste0("df_", names(list_data))
list2env(list_data, .GlobalEnv)

说明如何将for循环代码转换为lapply

这是for循环代码:

for(i in unique(as.character(df$Group))) {
   nam <- paste("df", i, sep = ".")
   assign(nam, df[df$Group==i,])
   #More code
   #More code
   #More code
}

要将其更改为lapply

lapply(split(df, df$Group), function(x) {
   #More code
   #More code
   #More code
})

实际上,您也可以使用by,它不需要拆分数据。

by(df, df$Group, function(x) {
    #More code
    #More code
    #More code
})

您可以在df_green / df_saffron的{​​{1}}中访问for,而无需在x循环中访问lapply

答案 1 :(得分:0)

应该这样做:

for (v in unique(df$Group)){

  tmp <- subset(df, Group == v)
  assign(paste0('df_', tolower(v)), tmp)

}

我总是发现首先创建一个临时数据集比将所有数据压缩到1分配步骤中更容易

答案 2 :(得分:0)

根据RonakShah的建议,我尝试了以下操作:

temp < -NULL
for (i in unique(as.character(Group)){
    nam <- paste("df", i, sep = ".")
    assign(nam, df[df$Group==i,])
   # more code
   result <- data.frame(Date = dates_all,
                        Group = i,
                        Value = all_values,
                        Derived = der_vals) 
   }
 temp <-result
 final <-rbind(temp,result)

但是最后一个dataframe看起来像

      Date           Group       Value     Derived
    01-04-2029      Saffron      62.78      22
    01-04-2029      Saffron      75.65      34.46
    01-05-2019      Saffron      67.89      54
    01-06-2019      Saffron      54.56      78
    01-06-2019      Saffron      77.00      29.85
    01-07-2019      Saffron      71.22      45.67

换句话说,只有Saffron作为组被重复,尽管派生的值是正确的。 有人可以帮忙吗?