Таблица R с названиями стран в ячейках - PullRequest
0 голосов
/ 12 мая 2011

Моя цель - создать таблицу, в которой приведены страны, представленные в моей выборке.В этой таблице должно быть только две строки: первая строка с разными столбцами для каждого региона и вторая строка с названиями стран, которые расположены в соответствующем регионе.

Чтобы дать вам пример, это то, что мой data.frame XYZ выглядит так:

..................wvs5red2.s003names.....wvs5red2.regiondummies
21............."Hong Kong"......................Asian Tigers
45............."South Korea"....................Asian Tigers
49............."Taiwan".............................Asian Tigers
66............."China"...............................East Asia & Pacific
80............."Indonesia"........................East Asia & Pacific
86............."Malaysia"...........................East Asia & Pacific 

Моя цель - получить таблицу, похожую на эту:

region.............Asian Tigers..............................................East Asia & Pacific
countries........Hong Kong, South Korea, Taiwan...........China, Indonesia, etc.

У вас есть идеи, как получить такую ​​таблицу?У меня ушло несколько часов на поиски чего-то похожего.

Ответы [ 3 ]

4 голосов
/ 12 мая 2011

Самый простой способ - tapply:

XYZ <- structure(list(
    names = structure(c(2L, 5L, 6L, 1L, 3L, 4L), .Label = c("China", "Hong Kong", "Indonesia", "Malaysia", "South Korea", "Taiwan"), class = "factor"),
    region = structure(c(1L, 1L, 1L, 2L, 2L, 2L), .Label = c("Asian Tigers", "East Asia & Pacific"), class = "factor")),
    .Names = c("names", "region"), row.names = c(NA, -6L), class = "data.frame")

tapply(XYZ$names, XYZ$region, paste, collapse=", ")
#                     Asian Tigers              East Asia & Pacific 
# "Hong Kong, South Korea, Taiwan"     "China, Indonesia, Malaysia" 
3 голосов
/ 12 мая 2011

Воссоздайте данные:

dat <- data.frame(
    country = c("Hong Kong", "South Korea", "Taiwan", "China", "Indonesia", "Malaysia"),
    region = c(rep("Asian Tigers", 3), rep("East Asia & Pacific", 3))
)
dat

      country              region
1   Hong Kong        Asian Tigers
2 South Korea        Asian Tigers
3      Taiwan        Asian Tigers
4       China East Asia & Pacific
5   Indonesia East Asia & Pacific
6    Malaysia East Asia & Pacific

Используйте ddply в упаковке plyr в сочетании с paste для суммирования данных:

library(plyr)
ddply(dat, .(region), function(x)paste(x$country, collapse= ","))

               region                           V1
1        Asian Tigers Hong Kong,South Korea,Taiwan
2 East Asia & Pacific     China,Indonesia,Malaysia
2 голосов
/ 12 мая 2011

Первое создание данных:

> country<-c("Hong Kong","Taiwan","China","Indonesia")
> region<-rep(c("Asian Tigers","East Asia & Pacific"),each=2)
> df<-data.frame(country=country,region=region)

Затем пропустите колонку region и соберите все страны. Мы можем использовать tapply, но я буду использовать dlply из пакета plyr , поскольку он сохраняет имена списков.

> ll<-dlply(df,~region,function(d)paste(d$country,collapse=","))
> ll
$`Asian Tigers`
[1] "Hong Kong,Taiwan"

$`East Asia & Pacific`
[1] "China,Indonesia"

attr(,"split_type")
[1] "data.frame"
attr(,"split_labels")
               region
1        Asian Tigers
2 East Asia & Pacific

Теперь преобразуйте список в data.frame, используя do.call. Поскольку нам нужны красивые имена, нам нужно передать аргумент check.names=FALSE:

> ll$check.names <- FALSE
> do.call("data.frame",ll)
      Asian Tigers East Asia & Pacific
1 Hong Kong,Taiwan     China,Indonesia
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...