我尝试使用reshape()函数的许多变体(reshape2包)将不同因子的数据帧转换为两列矩阵,但我没有成功。我还需要忽略空白。这是我尝试完成的一个简化示例:
Code Bucket1 Bucket2
1绿蓝
2绿色(空白)
3(空白)(空白)
4(空白)蓝色
INTO:
代码存储区
1绿色
1蓝色
2绿色
4 Blue
有人可以帮助reshape()?
答案 0 :(得分:2)
reshape2 包中包含melt
函数,用于将数据集从 wide 转换为 long 格式。有一个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
)并按Code
排序(使用arrange
),尽管肯定有其他方法可以在melt
之后操纵结果。
require(dplyr)
dat %>%
melt(id.vars = "Code", na.rm = TRUE, value.name = "Bucket") %>%
select(-variable) %>%
arrange(Code)
现在结果如下:
Code Bucket 1 1 Green 2 1 Blue 3 2 Green 4 4 Blue
答案 1 :(得分:1)
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]