我尝试过使用reshape()函数(reshape2包)的许多变体来将包含不同因素的数据框架转换为两列矩阵,但我没有成功。我也需要忽略空白。下面是一个简单的示例,说明了我要完成的任务:
代码Bucket1 Bucket2
1绿色蓝色
2绿色(空白)
3(空白)(空白)
4(空白)蓝色
转入:
码桶
1绿色
1蓝色
2绿色
4蓝色
有人能帮忙重塑()吗?
发布于 2014-09-26 19:18:46
library(data.table)
dat <- as.data.table(your_original_data.frame)
dat[, c(Bucket1, Bucket2), by=Code]
Code V1
1: 1 Green
2: 1 Blue
3: 2 Green
4: 2 NA
5: 3 NA
6: 3 NA
7: 4 NA
8: 4 Blue
## To drop the NA's
dat[, c(Bucket1, Bucket2), by=Code][!is.na(V1)]
Code V1
1: 1 Green
2: 1 Blue
3: 2 Green
4: 4 Blue
## if they are actually called "(Blank)" use
dat[, c(Bucket1, Bucket2), by=Code][V1 != "(Blank)"]更新:要将您的因素转换为字符:
colsToConvert <- setdiff(names(dat), "Code") # or manually type them
dat[, c(colsToConvert) := lapply(.SD, as.character), .SDcols = colsToConvert]发布于 2014-09-26 19:59:11
reshape2包包含一个melt函数,用于将数据集从宽格式转换为长格式。有一个reshape函数,它是**stats*包的一部分,它对于重塑数据也很有用,但不是我很熟悉的函数。
要重塑您所描述的数据,可以使用melt,如下所示。我猜您的空格是NA,所以我使用na.rm参数来删除它们。我使用value.name参数来命名创建的新列。
melt(dat, id.vars = "Code", na.rm = TRUE, value.name = "Bucket")结果:
Code variable Bucket
1 1 Bucket1 Green
2 2 Bucket1 Green
5 1 Bucket2 Blue
8 4 Bucket2 Blue这没有给出您所请求的确切输出,因为您希望您的最终数据集按特定的顺序进行,并且不需要新的variable列。您可以使用dplyr包中的一些方便的函数来删除额外的列(使用select)和OrderbyCode(使用arrange),尽管在melting之后当然还有其他方法来操作结果。
require(dplyr)
dat %>%
melt(id.vars = "Code", na.rm = TRUE, value.name = "Bucket") %>%
select(-variable) %>%
arrange(Code)现在的结果看起来是:
代号桶1 1绿2 1蓝3 2绿4 4蓝
https://stackoverflow.com/questions/26066585
复制相似问题