2016-10-26 1 views
0

私は3つのデータフレーム(df1、df2、df3)をさまざまな方法で生成しています。彼らは同じデータ構造を持っていますが、それらの値は異なるかもしれません。各セルは、4つの値「A」、「B」、「H」、または「 - 」のいずれかになります。私は、3つのデータフレームから多数の値を取り、そうでなければ " - "を与えてコンセンサステーブルを作りたいと思います。本当に助けていただければ幸いです。複数のデータフレームにわたって多数値を取る方法

df1 = read.table(text="ID S01 S02 S03 S04 S05 
M01 A H A B B 
M02 A H A B A 
M03 A A H B A 
M04 B A H B H 
M05 B A H B A 
M06 B B H B A 
M07 H B B H B 
M08 H B B H A 
M09 H B B H A 
M10 H B B H A", header=T, stringsAsFactors=F) 

df2 = read.table(text="ID S01 S02 S03 S04 S05 
M01 A H A B A 
M02 A H A B A 
M03 H A H B A 
M04 H A H B A 
M05 B A H B A 
M06 B A B B A 
M07 - B B - B 
M08 H B B H A 
M09 H B B H A 
M10 H B B H A", header=T, stringsAsFactors=F) 

df3 = read.table(text="ID S01 S02 S03 S04 S05 
M01 B H A B A 
M02 A H A B A 
M03 B A H B A 
M04 B A H B B 
M05 B A H B A 
M06 B A H B A 
M07 A B B H H 
M08 H B B H A 
M09 H B B H A 
M10 H B B H A", header=T, stringsAsFactors=F) 

期待される結果:

df = read.table(text="ID S01 S02 S03 S04 S05 
M01 A H A B A 
M02 A H A B A 
M03 - A H B A 
M04 B A H B - 
M05 B A H B A 
M06 B A H B A 
M07 - B B H B 
M08 H B B H A 
M09 H B B H A 
M10 H B B H A", header=T, stringsAsFactors=F) 

答えて

2

我々はそれが要素のMode

を取得し、列をループし、 'ID' でグループ化され、 rbindlistでデータセットを保ちます
library(data.table) 
Mode <- function(x) { 
    if(uniqueN(x)==length(x)){ 
    "-" } else { 
    ux <- unique(x) 
    ux[which.max(tabulate(match(x, ux)))] } 
} 

rbindlist(mget(paste0("df", 1:3)))[, lapply(.SD, Mode) , by = ID] 
#  ID S01 S02 S03 S04 S05 
# 1: M01 A H A B A 
# 2: M02 A H A B A 
# 3: M03 - A H B A 
# 4: M04 B A H B - 
# 5: M05 B A H B A 
# 6: M06 B A H B A 
# 7: M07 - B B H B 
# 8: M08 H B B H A 
# 9: M09 H B B H A 
#10: M10 H B B H A 
2

@ akrunの回答に似ていますが、テーブルを結合して各セルのモードを見つける方法が少し異なります。

)が "data.master" にテーブルを結合:

df1$df <- 1 
df2$df <- 2 
df3$df <- 3 

data.master <- do.call(rbind, list(df1, df2, df3)) 

計算モード:

library(dplyr) 

data.mode <- data.master %>% 
    group_by(ID) %>% 
    summarize_all(function(x) ifelse(sort(table(x), decreasing = T)[1] > 1, names(sort(table(x), decreasing = T))[1], '-')) %>% 
    select(-df) 

     ID S01 S02 S03 S04 S05 
    <chr> <chr> <chr> <chr> <chr> <chr> 
1 M01  A  H  A  B  A 
2 M02  A  H  A  B  A 
3 M03  -  A  H  B  A 
4 M04  B  A  H  B  - 
5 M05  B  A  H  B  A 
6 M06  B  A  H  B  A 
7 M07  -  B  B  H  B 
8 M08  H  B  B  H  A 
9 M09  H  B  B  H  A 
10 M10  H  B  B  H  A 
1

基本R溶液:

options(stringsAsFactors = FALSE) 
moda = function(x){ 
    # here we rely on the fact that we have only three data.frame's 
    dupl = anyDuplicated(x) 
    if(dupl){ 
     x[dupl] 
    } else { 
     "-" 
    } 
} 

aggregate(. ~ ID, 
      data = rbind(df1, df2, df3), 
      FUN = moda 
     ) 

#  ID S01 S02 S03 S04 S05 
# 1 M01 A H A B A 
# 2 M02 A H A B A 
# 3 M03 - A H B A 
# 4 M04 B A H B - 
# 5 M05 B A H B A 
# 6 M06 B A H B A 
# 7 M07 - B B H B 
# 8 M08 H B B H A 
# 9 M09 H B B H A 
# 10 M10 H B B H A 
関連する問題