объединить таблицы в R, объединить ячейки, если в обоих - PullRequest
1 голос
/ 18 марта 2019

Здравствуйте, не могли бы вы объяснить, как я могу объединить две таблицы, чтобы их можно было использовать для создания круговой диаграммы?

#read input data
dat = read.csv("/ramdisk/input.csv", header = TRUE, sep="\t")

# pick needed columns and count the occurences of each entry
df1 = table(dat[["C1"]])
df2 = table(dat[["C2"]])

# rename columns
names(df1) <- c("ID", "a", "b", "c", "d")
names(df2) <- c("ID", "e", "f", "g", "h")

# show data for testing purpose
df1  
# ID   a   b   c   d 
#241  18  17  28  29 
df2
# ID   e   f   g   h 
#230  44   8  37  14 
# looks fine so far, now the problem:

# what I want to do ist merging df and df2 
# so that df will contain the overall numbers of each entry
# df should print
# ID   a   b   c   d    e   f   g   h 
#471  18  17  28  29   44   8  37  14 
# need them to make a nice piechart in the end
#pie(df) 

Я предполагаю, что это можно как-то сделать с помощью объединения, но я не нашелправильно.Наиболее близким решением, которое я нашел, было слияние (df1, df2, all = TRUE), но это было не совсем то, что мне было нужно.

Ответы [ 3 ]

1 голос
/ 18 марта 2019

Подход был бы к stack, затем rbind и к aggregate

out <- aggregate(values ~ ., rbind(stack(df1), stack(df2)), sum)

Чтобы получить имя vector

with(out, setNames(values, ind))

Или другой подход - объединить таблицы и затем использовать tapply, чтобы создать группу по sum

v1 <- c(df1, df2)
tapply(v1, names(v1), sum)

Или с rowsum

rowsum(v1, group = names(v1))
0 голосов
/ 18 марта 2019

Я написал пакет safejoin, который обрабатывает задачи такого типа интуитивно (надеюсь!).Вам просто нужно иметь общий идентификатор между двумя вашими таблицами (для этого мы будем использовать tibble::row_id_to_column), а затем вы можете объединить и обработать конфликт столбцов с sum.

Используя данные @ pierre-lapointe:

library(tibble)
# devtools::install_github("moodymudskipper/safejoin")
library(safejoin)

res <- safe_inner_join(rowid_to_column(df1),
                       rowid_to_column(df2),
                       by = "rowid",
                       conflict = sum)

res
#   rowid  ID  a  b  c  d  e f  g  h
# 1     1 471 18 17 28 29 44 8 37 14

Для данной строки (здесь первая и единственная) вы можете получить свою круговую диаграмму, преобразовав вектор с unlist и удалив ненужные 2 первых элемента:

pie(unlist(res[1,])[-(1:2)])
0 голосов
/ 18 марта 2019

Другой подход заключается в использовании rbindlist из data.table и colSums для получения итогов.rbindlist с fill=TRUE принимает все столбцы, даже если их нет в обеих таблицах.

df1<-read.table(text="ID   a   b   c   d 
241  18  17  28  29 ",header=TRUE)
df2<-read.table(text="ID   e   f   g   h 
230  44   8  37  14" ,header=TRUE)

library(data.table)
setDT(df1)
setDT(df2)
res <- rbindlist(list(df1,df2), use.names=TRUE, fill=TRUE)
colSums(res, na.rm=TRUE)

 ID   a   b   c   d   e   f   g   h 
471  18  17  28  29  44   8  37  14 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...