Объединить столбцы разной длины и отсутствующие значения в R

У меня простая проблема, честно говоря, я пытался найти ответ. Я действительно сделал.

У меня есть куча файлов .csv, которые были импортированы в фреймы данных R.

Я хотел бы взять определенный столбец (с общим именем) из каждого фрейма данных, объединить его в один фрейм данных с именем фрейма данных в качестве имени столбца и создать блок-график, используя каждый столбец.

Столбцы имеют разную длину и часто содержат NA.

Пример: фреймы данных (в которых первая строка является заголовком)

Имя фрейма данных Tom:

col1    col2 col3 col4
name1   33   44   55
name2   33   NA   55
name3   33   34   55
name4   33   24   55

Имя фрейма данных Bob:

col1    col2 col3 col4
name5   33   74   55
name6   33   NA   55
name7   33   32   55

Имя фрейма данных Stu:

col1    col2 col3 col4
name8   33   44   55
name9   33   11   55
name10  33   34   55
name11  33   24   55
name12  33   32   55
name13  33   24   5
name14  33   34   55
name15  33   24   5

Желаемый результат

Tom  Bob  Stu
44   74   44
NA   NA   11 
34   32   34
24        24
          32
          24
          34
          24

Итак, взяв «col3» (имя столбца является общим) из каждого фрейма данных и создайте новый фрейм данных только из данных col3, каждый столбец будет назван именем фрейма данных, из которого он пришел... создание бок-о-бок Тома, Боба и Стью (но я, вероятно, смогу это понять). Это нормально, если в желаемом результате выше есть NA в пустых местах.


person user1687421    schedule 08.11.2012    source источник
comment
Мне кажется, что было бы больше отправлено, чтобы поместить данные в длинный формат?   -  person Dason    schedule 08.11.2012


Ответы (2)


Вот базовый подход, при котором я создаю новый комбинированный фрейм данных, используя rbind, после добавления столбца идентификатора в каждый из ваших 3 фреймов данных. Обратите внимание, что вы также можете создать коробочную диаграмму без предварительного создания одного фрейма данных.

Tom = read.table(header=TRUE,
text="col1    col2 col3 col4
name1   33   44   55
name2   33   NA   55
name3   33   34   55
name4   33   24   55")

Bob = read.table(header=TRUE,
text="col1    col2 col3 col4
name5   33   74   55
name6   33   NA   55
name7   33   32   55")

Stu = read.table(header=TRUE,
text="col1    col2 col3 col4
name8   33   44   55
name9   33   11   55
name10  33   34   55
name11  33   24   55
name12  33   32   55
name13  33   24   5
name14  33   34   55
name15  33   24   5")

# Add a new person identifier column to each data frame.
Tom$person = "Tom"
Bob$person = "Bob"
Stu$person = "Stu"

# Combine 3 data frames by row.
dat = rbind(Tom, Bob, Stu)

dat
#      col1 col2 col3 col4 person
# 1   name1   33   44   55    tom
# 2   name2   33   NA   55    tom
# 3   name3   33   34   55    tom
# 4   name4   33   24   55    tom
# 5   name5   33   74   55    bob
# 6   name6   33   NA   55    bob
# 7   name7   33   32   55    bob
# 8   name8   33   44   55    stu
# 9   name9   33   11   55    stu
# 10 name10   33   34   55    stu
# 11 name11   33   24   55    stu
# 12 name12   33   32   55    stu
# 13 name13   33   24    5    stu
# 14 name14   33   34   55    stu
# 15 name15   33   24    5    stu


boxplot(col3 ~ person, data=dat)

# This would also work, without rearranging the data:
boxplot(Tom[, "col3"], Bob[, "col3"], Stu[, "col3"])

# Save to pdf file.
pdf("boxplot_1.pdf", height=5, width=5)
boxplot(col3 ~ person, data=dat, main="Boxplot of three samples.", ylab="col3")
dev.off()

введите здесь описание изображения

person bdemarest    schedule 08.11.2012
comment
Отлично, спасибо! Это прекрасно работает, и теперь я могу экстраполировать его для решения других проблем, которые у меня были. Очень признателен. - person user1687421; 08.11.2012

Поместите ваши data.frames в именованный список, здесь пригодится llist из пакета Hmisc

library(Hmisc)
data.list <- llist(Tom, Bob, Stu)
library(reshape2)
# get a long format version of col3
col3 <- melt(lapply(data.list, `[[`, 'col3'))
# the column `L1` contains the names Tom, Bob, Stu

library(ggplot2)
# create the boxplots

ggplot(col3, aes(x=L1, y= value)) + geom_boxplot()

введите здесь описание изображения

person mnel    schedule 08.11.2012
comment
Спасибо.. Я пытаюсь сделать это с минимумом нестандартных пакетов, но я попробую и это. - person user1687421; 08.11.2012
comment
Hmisc, ggplot2 и reshape2 — очень полезные, хорошо поддерживаемые неосновные пакеты. - person mnel; 08.11.2012
comment
Верно, но это для программы, которая, надеюсь, может быть использована людьми даже менее компетентными, чем я, поэтому я пока упрощаю. - person user1687421; 08.11.2012