簡體   English   中英

根據列值 R 合並 dataframe 中的列

[英]Merge columns within dataframe based on column value R

我目前有這個結構的數據框

    ID-No  cigsaday   activity  
    1      NA        1           
    2      NA        1          
    1       5       NA          
    2       5       NA          

我想連接具有相同 ID 號的行並創建一個應該看起來像這樣的新數據框

ID-No  cigsaday   activity  
    1      5        1           
    2      5        1

數據框包括字符和數字,這樣我們將根據參與者 ID 進行匹配,該參與者 ID 在第一列的數據集中出現 4 次。

任何幫助表示贊賞!

使用 na.locf() 的一種可能解決方案,它將一個值替換為最新的非 NA 值。

library(zoo)

dat %>% 
  group_by(IDNo) %>% 
  mutate_at(vars(-group_cols()),.funs=function(x) na.locf(x)) %>% 
  distinct(IDNo,cigsaday,activity,.keep_all = TRUE) %>% 
  ungroup()

data.table選項

> setDT(df)[, lapply(.SD, na.omit), ID_No]
   ID_No cigsaday activity
1:     1        5        1
2:     2        5        1

數據

> dput(df)
structure(list(ID_No = c(1L, 2L, 1L, 2L), cigsaday = c(NA, NA,
5L, 5L), activity = c(1L, 1L, NA, NA)), class = "data.frame", row.names = c(NA,
-4L))

許多方式導致羅馬。 為了完整起見,這里有一些其他方法可以返回給定樣本數據集的預期結果。 你的旅費可能會改變。

1. dplyr,na.omit()

library(dplyr)
df %>% 
  group_by(ID_No) %>% 
  summarise(across(everything(), na.omit))
 `summarise()` ungrouping output (override with `.groups` argument) # A tibble: 2 x 3 ID_No cigsaday activity <int> <int> <int> 1 1 5 1 2 2 5 1

請注意,這是 ThomasIsCoding答案dplyr版本。

2. dplyr,減少(),合並()

library(dplyr)
df %>% 
  group_by(ID_No) %>% 
  summarise(across(everything(), ~ purrr::reduce(.x, coalesce)))

3. data.table, fcoalesce()

library(data.table)
setDT(df)[, lapply(.SD, function(x) fcoalesce(as.list(x))), ID_No]
 ID_No cigsaday activity 1: 1 5 1 2: 2 5 1

4. data.table、Reduce()、fcoalesce()

library(data.table)
setDT(df)[, lapply(.SD, Reduce, f = fcoalesce), ID_No]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM