[英]Join specific columns of matching rows
我有這個數據框:
patientcA 1 2 NA NA b c
patientcB NA NA 3 4 b c
patientdA 3 3 NA NA d e
patientdB NA NA 5 6 d e
如何為第 1 列中匹配的行(最后一個字符除外)連接第 2、3、4 和 5 列。 在這種情況下,除了最后一個字符外,前兩行都匹配; 最后兩行做同樣的事情。 所以我的預期輸出是:
patientcA 1 2 3 4 b c
patientcB 1 2 3 4 b c
patientdA 3 3 5 6 d e
patientdB 3 3 5 6 d e
我已經嘗試過這樣的事情,但我不知道該寫什么作為else
論點。 此外,我認為這不是最好的方法:
new_data$first_column<-ifelse(grepl('A$', original_data$first), original_data$first, ?)
也許你可以考慮tidyverse
法,即使用separate
把第1列的最后一個字符到一個新的專欄,並fill
更換NA
針對同一病人的價值觀。
library(tidyverse)
df %>%
separate(V1, into = c("patient", "letter"), sep = -1) %>%
group_by(patient) %>%
fill(V2:V5, .direction = "downup")
輸出
patient letter V2 V3 V4 V5 V6 V7
<chr> <chr> <int> <int> <int> <int> <chr> <chr>
1 patientc A 1 2 3 4 b c
2 patientc B 1 2 3 4 b c
3 patientd A 3 3 5 6 d e
4 patientd B 3 3 5 6 d e
您可以編寫一個像下面的CC()
這樣的矢量化函數,它完成列,然后 split-apply-combine with by
。
CC <- Vectorize(function(x) if (any(is.na(x))) rep(x[!is.na(x)], length(x)) else x)
res <- do.call(rbind.data.frame, by(dat, substr(dat$V1, 8, 8), CC))
res
# V1 V2 V3 V4 V5 V6 V7
# c.1 patientcA 1 2 3 4 b c
# c.2 patientcB 1 2 3 4 b c
# d.1 patientdA 3 3 5 6 d e
# d.2 patientdB 3 3 5 6 d e
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.