考虑我一个n00b,但我在这里搜索了我的具体查询,但我还没有找到答案。我的问题如下。请考虑以下简化的csv文件r_split.csv,它代表我的数据集:
id,v1,v2,v3,v4,str
1,2.4,2.4,345.5,234.2,gbbc
2,4.5,2.56,7.45,34.6,ebird
3,3.4,5.6,4.45,6.3,ebird_can
第一行包含标题名称。您可以看到列str包含3个不同的字符串值,即gbbc, ebird, ebird_can
。我的目标是将这个大数据集拆分为2个数据集。第一个将仅包含所有str值= gbbc
,第二个将包含ebird
和ebird_can
重命名为allebird
的所有str值。
我可以使用以下命令将数据集拆分为3个不同的数据集:
splitted<-split(rsplit,rsplit$str)
但是,我无法弄清楚如何使用str列的2个不同值并将它们组合成第三个。有人可以帮帮我吗?
感谢。
答案 0 :(得分:2)
首先,确保str
列不是factor
。使用stringsAsFactors = FALSE
中的read.csv(.)
选项将所有字符串加载为字符,将不加载为因子。
其次,在交互式会话期间使用subset
很好。但是,正如this post(或direct link to hadley's wiki很好地解释,在您的函数中使用它是不明智的。
我建议使用[
直接进行子集化。
df1 <- df[df$str == "gbbc", ]
df2 <- df[df$str != "gbbc", ]
df2$str <- "allebird"
> df1
# id v1 v2 v3 v4 str
# 1 1 2.4 2.4 345.5 234.2 gbbc
> df2
# id v1 v2 v3 v4 str
# 2 2 4.5 2.56 7.45 34.6 allebird
# 3 3 3.4 5.60 4.45 6.3 allebird
或者,如果只有两个值“gbbc”和“allebird”,那么你可以先用“allebird”替换除“gbbc”之外的所有其他内容,然后如你所说,使用split。
df3 <- df
df3$str[df3$str != "gbbc"] <- "allebird"
split(df3, df3$str)
# $allebird
# id v1 v2 v3 v4 str
# 2 2 4.5 2.56 7.45 34.6 allebird
# 3 3 3.4 5.60 4.45 6.3 allebird
#
# $gbbc
# id v1 v2 v3 v4 str
# 1 1 2.4 2.4 345.5 234.2 gbbc
答案 1 :(得分:2)
您可以使用levels
功能更改和合并因子的级别。对于您的情况(假设str已经是具有默认级别排序的因素),您可以执行以下操作:
levels(rsplit$str) <- c('allebird','allebird','gbbc')
splitted<-split(rsplit,rsplit$str)
您可能需要首先复制rsplit并修改副本而不是原始副本(如果您希望将原始版本保留为原始级别)。
对于更复杂的示例,您可以使用grep
,gsub
或gsubfn包等工具来创建新的因子级别向量。