将包含具有3个字符串值的列的R数据集拆分为包含2个字符串值的2个数据集

时间:2013-03-18 20:13:51

标签: r dataframe subset

考虑我一个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,第二个将包含ebirdebird_can重命名为allebird的所有str值。

我可以使用以下命令将数据集拆分为3个不同的数据集:

splitted<-split(rsplit,rsplit$str)

但是,我无法弄清楚如何使用str列的2个不同值并将它们组合成第三个。有人可以帮帮我吗?

感谢。

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并修改副本而不是原始副本(如果您希望将原始版本保留为原始级别)。

对于更复杂的示例,您可以使用grepgsub或gsubfn包等工具来创建新的因子级别向量。