Элегантный способ объединения кадров данных в R?

89
8

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

Первый фрейм данных имеет мой список фруктов:

fruits <- read.table(header=TRUE, text="shop    fruit
1 apple
2 orange
3 apple
4 pear
2 banana
1 banana
1 orange
3 banana")

Второй кадр данных имеет мои атрибуты:

fruit_class <- read.table(header=TRUE, text="fruit  type    origin
apple pome asia
banana berry asia
orange citrus asia
pear pome newguinea")

Здесь мое неуклюжее решение проблемы:

fruit <- as.data.frame(unique(fruit[,2])) #get a list of unique fruits
colnames(fruit)[1] <- "fruit" #this won't rename the column and I don't know why...
fruit_summary <- join(fruits, fruit_class, by="fruit" #create a data frame that I can query
count(fruit_summary, "origin") #for eg, summarise the number of fruits of each origin

Поэтому мой главный вопрос: как это можно выразить более элегантно (т.е. Одна строка, а не 3)? Вторично: почему он не позволит мне переименовать столбец?

заранее спасибо

спросил(а) 2016-10-25T08:31:00+03:00 3 года, 11 месяцев назад
1
Решение
57

Просто делать

table(fruit_class$fruit, fruit_class$origin)

дает тебе

       asia newguinea
apple 1 0
banana 1 0
orange 1 0
pear 0 1

Вы можете добавить номера colSums() с помощью colSums(). Я не могу думать о причине fruits требуется кадр данных, потому что, если есть фрукты здесь не в fruit_class, нет никаких данных происхождения для него в любом случае.

Кстати, в вашем примере кода, colnames(fruit)[1] <- "fruit" должны работать, но colnames(fruit) <- "fruit" только colnames(fruit) <- "fruit" так как colnames всего 1 элемент длинный в любом случае.

ответил(а) 2016-10-25T12:49:00+03:00 3 года, 11 месяцев назад
40

Вот решение data.table.


library(data.table)
setDT(fruit_class)[, uniqueN(fruit), by=type]
# type V1
# 1: pome 2
# 2: berry 1
# 3: citrus 1

setDT(fruit_class)[, uniqueN(fruit), by=origin]
# origin V1
# 1: asia 3
# 2: newguinea 1

ответил(а) 2016-10-26T05:17:00+03:00 3 года, 11 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема