0

考虑我是一个 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,第二个将包含所有 str 值并重ebird命名ebird_canallebird

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

splitted<-split(rsplit,rsplit$str)

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

谢谢。

4

2 回答 2

2

首先,确保str列不是factor. 使用stringsAsFactors = FALSE选项内read.csv(.)将所有字符串加载为字符而不是因子。

其次,可以subset在交互式会话期间使用。然而,正如这篇文章(或直接链接到 hadley 的 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”之外的所有内容,然后,正如您所提到的,使用拆分。

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
于 2013-03-18T20:28:46.543 回答
2

您可以使用该levels功能来更改和合并因子的水平。对于您的情况(假设 str 已经是默认级别排序的一个因素),您可以执行以下操作:

levels(rsplit$str) <- c('allebird','allebird','gbbc')
splitted<-split(rsplit,rsplit$str)

您可能需要先制作 rsplit 的副本并修改副本而不是原始版本(如果您想保留原始级别的原始版本)。

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

于 2013-03-18T20:50:49.197 回答