这是我昨晚回答的问题,因为我正在重新考虑如何格式化我的数据。我做了搜索,但找不到任何适用的答案;我可能会用错误的术语搜索。
我有一个包含许多行的数据表,我想将它们组合在一起:
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
每行将始终填充col_a,col_b或col_c。它将永远不会超过其中3个人口。我想将这些(/)转换为每个记录的一行,所以看起来像这样:
record_numb col_a col_b col_c
1 123 234 345
2 987 765 543
我玩融化/演员一点,但我是R的新手,我的一半问题是知道什么是可用的。有很多东西可以使用,我希望你们中的一个人可以指出我的一个包装或功能。我执行的搜索指向我融化和演员等,但我无法将其应用于此案例。我愿意使用任何功能或包。
答案 0 :(得分:4)
如您所说,您希望在评论中使用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
.SD
基本上说,&#34;取得data.table&#34;中的所有变量。除了参数中的那些。在@Frank的回答中,他使用.SDcols
减少了变量集。如果要将变量转换为数字,您仍然可以在一行中执行此操作。这是一种链接方法。
df[, lapply(.SD, paste0, collapse=""), by=record_numb][, lapply(.SD, as.integer)]
第二个&#34;链&#34;将所有变量转换为整数。
答案 1 :(得分:3)
您可以重塑为长格式,删除空白条目然后返回宽屏:
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
首先使用magrittr可能会发现它更具可读性:
library(magrittr)
res = df %>%
melt(id.vars = "record_numb") %>%
.[ value != "" ] %>%
dcast(record_numb ~ variable)
这些数字仍然是格式化为字符串,但您可以使用...
转换它们cols = setdiff(names(res), "record_numb")
res[, (cols) := lapply(.SD, type.convert), .SDcols = cols]
类型转换会将每个列更改为它应该是的任何类(数字,整数,等等)。请参阅?type.convert
。
答案 2 :(得分:0)
只需这样做:
df = df %>% group_by(record_numb) %>%
summarise(col_a = sum(col_a, na.rm = T),
col_b = sum(col_b, na.rm = T),
col_c = sum(col_c, na.rm = T))
....代替“ sum”,您可以使用min,max或其他任何形式。