我有一个数据框(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.Green
或df.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的新手,因此想知道我错过了什么地方的任何线索吗?
答案 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
作为组被重复,尽管派生的值是正确的。
有人可以帮忙吗?