这是我昨晚回答的一个问题的附带支持,因为我正在重新考虑我想如何格式化我的数据。我确实进行了搜索,但找不到任何适用的答案;我可能正在用错误的术语进行搜索。
我有一个包含许多行的数据表,我想合并这些行:
record_numb <- c(1,1,1,2,2,2)
col_a <- c(123,'','',987,'','')
col_b <- c('','234','','','765','')
col_c <- c('','','543','','','543')
df <- data.frame(record_numb,col_a,col_b,col_c)
library(data.table)
setDT(df)
record_numb col_a col_b col_c
1 123
1 234
1 345
2 987
2 765
2 543
Run Code Online (Sandbox Code Playgroud)
每行将始终填充 col_a、col_b 或 col_c。它永远不会超过这 3 个中的 1 个。我想将(?)这些转换为每条记录的一行,所以它看起来像这样:
record_numb col_a col_b col_c
1 123 234 345
2 987 765 543
Run Code Online (Sandbox Code Playgroud)
我玩了一点融化/铸造,但我是 R 的新手,我的一半问题是知道可以使用什么。有这么多可以使用,我希望你们中的一个人可以指出我的包或功能。我进行的搜索指向我熔化和铸造等,但我无法将其应用于这种情况。我愿意使用任何函数或包。
正如您建议您希望data.table在评论中找到解决方案一样,您可以使用
library(data.table)
df <- data.table(record_numb,col_a,col_b,col_c)
df[, lapply(.SD, paste0, collapse=""), by=record_numb]
record_numb col_a col_b col_c
1: 1 123 234 543
2: 2 987 765 543
Run Code Online (Sandbox Code Playgroud)
.SD基本上说,“获取我的 data.table 中的所有变量”,除了 by 参数中的变量。在@Frank 的回答中,他使用.SDcols. 如果您想将变量转换为数字,您仍然可以在一行中执行此操作。这是一个链接方法。
df[, lapply(.SD, paste0, collapse=""), by=record_numb][, lapply(.SD, as.integer)]
Run Code Online (Sandbox Code Playgroud)
第二个“链”将所有变量转换为整数。
您可以将形状重新调整为长格式,删除空白条目,然后返回宽格式:
res <- dcast(melt(df, id.vars = "record_numb")[ value != "" ], record_numb ~ variable)
record_numb col_a col_b col_c
1: 1 123 234 543
2: 2 987 765 543
Run Code Online (Sandbox Code Playgroud)
起初使用 magrittr 时,您可能会发现它更具可读性:
library(magrittr)
res = df %>%
melt(id.vars = "record_numb") %>%
.[ value != "" ] %>%
dcast(record_numb ~ variable)
Run Code Online (Sandbox Code Playgroud)
数字仍然格式化为字符串,但您可以使用...
cols = setdiff(names(res), "record_numb")
res[, (cols) := lapply(.SD, type.convert), .SDcols = cols]
Run Code Online (Sandbox Code Playgroud)
类型转换会将每一列更改为它看起来应该是的任何类(数字、整数等)。见?type.convert。