[英]R collapse multiple rows into 1 row - same columns
這是我昨晚回答的一個問題的附帶支持,因為我正在重新考慮我想如何格式化我的數據。 我確實進行了搜索,但找不到任何適用的答案; 我可能正在用錯誤的術語進行搜索。
我有一個包含許多行的數據表,我想合並這些行:
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 個中的 1 個。 我想將(?)這些轉換為每條記錄的一行,所以它看起來像這樣:
record_numb col_a col_b col_c
1 123 234 345
2 987 765 543
我玩了一點融化/鑄造,但我是 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
.SD
基本上說,“獲取我的 data.table 中的所有變量”,除了 by 參數中的變量。 在.SDcols
的回答中,他使用.SDcols
減少了變量.SDcols
。 如果您想將變量轉換為數字,您仍然可以在一行中執行此操作。 這是一個鏈接方法。
df[, lapply(.SD, paste0, collapse=""), by=record_numb][, lapply(.SD, as.integer)]
第二個“鏈”將所有變量轉換為整數。
您可以將形狀重新調整為長格式,刪除空白條目,然后返回寬格式:
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
。
只需這樣做:
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))
.... 代替“總和”,您可以使用最小值、最大值或其他任何值。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.