簡體   English   中英

合並兩個數據框 R

[英]Merge two data frames R

我創建了兩個數據框:

tab1 <- medivmind %>% select(medi_total_factor, participant_id) %>% filter(!is.na(medi_total_factor)) %>% count(medi_total_factor, .drop = FALSE) %>% add_column(diet = "medi") %>% rename(n_medi = n, score = medi_total_factor)
DF1
評分 n_medi 飲食
1 0 0 中號
2 0.5 0 中
3 1 7 中號
4 1.5 0 中
5 2 12 中號
6 2.5 0 中
...

tab2 <- medivmind %>% select(mind_total_factor, participant_id) %>% filter(!is.na(mind_total_factor)) %>% count(mind_total_factor, .drop = FALSE) %>% add_column(diet = "mind") %>% rename(n_mind = n, score = mind_total_factor) DF2
得分 n_mind 飲食
1 0 0 頭腦
2 0.5 0 介意
3 1 0 頭腦
4 1.5 0 介意
5 2 0 心
6 2.5 0 介意
...

我想合並它們看起來像:
得分 n_mind 飲食
1 0 0 頭腦
2 0 0 媒體
3 0.5 0 介意
4 0.5 0 中
5 1 0 頭腦
6 1 0 中號
7 1.5 0 介意
8 1.5 0 中
...

我試過 rbind、cbind、left_join 但我不斷得到以下(或變體):
得分 n_medi 飲食得分 n_mind 飲食
1 0 0 中間 0 0 頭腦
2 0.5 0 中 0.5 0 頭腦
3 1 7 中 1 0 頭腦
4 1.5 0 中 1.5 0 頭腦
5 2 12 中 2 0 頭腦

更新:你想要這個:

tab3 <- left_join(tab1, tab2, by="score") %>% 
  pivot_longer(starts_with("diet")) %>% 
  select(score, n_medi, n_mind, diet=value) %>% 
  group_by(score) %>% 
  arrange(desc(diet), .by_group = TRUE) %>% 
  mutate(n_medi = ifelse(lead(n_medi==n_medi), n_medi, NA))
   score n_medi n_mind diet 
   <dbl>  <int>  <int> <chr>
 1   0        0      0 mind 
 2   0       NA      0 medi 
 3   0.5      0      0 mind 
 4   0.5     NA      0 medi 
 5   1        7      0 mind 
 6   1       NA      0 medi 
 7   1.5      0      0 mind 
 8   1.5     NA      0 medi 
 9   2       12      0 mind 
10   2       NA      0 medi 
11   2.5      0      0 mind 
12   2.5     NA      0 medi 

我們可以這樣做:

library(dplyr)
library(tidyr)

left_join(DF1, DF2, by="score") %>% 
  pivot_longer(starts_with("diet")) %>% 
  select(score, n_medi, diet=value) %>% 
  group_by(score) %>% 
  arrange(desc(diet), .by_group = TRUE)
  score n_medi diet 
   <dbl>  <int> <chr>
 1   0        0 mind 
 2   0        0 medi 
 3   0.5      0 mind 
 4   0.5      0 medi 
 5   1        7 mind 
 6   1        7 medi 
 7   1.5      0 mind 
 8   1.5      0 medi 
 9   2       12 mind 
10   2       12 medi 
11   2.5      0 mind 
12   2.5      0 medi 

數據:

> dput(DF1)
structure(list(score = c(0, 0.5, 1, 1.5, 2, 2.5), n_medi = c(0L, 
0L, 7L, 0L, 12L, 0L), diet = c("medi", "medi", "medi", "medi", 
"medi", "medi")), class = "data.frame", row.names = c("1", "2", 
"3", "4", "5", "6"))
> dput(DF2)
structure(list(score = c(0, 0.5, 1, 1.5, 2, 2.5), n_mind = c(0L, 
0L, 0L, 0L, 0L, 0L), diet = c("mind", "mind", "mind", "mind", 
"mind", "mind")), class = "data.frame", row.names = c("1", "2", 
"3", "4", "5", "6"))

暫無
暫無

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

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