サンプルデータを使用したRでのアプローチは次のとおりです。
x <- cbind(mydf[, c("Date", "Country", "ID")],
stack(mydf[, c("Fruit", "Favorite", "Money")]))
reshape(x, direction = "wide", idvar = c("Date", "Country", "ind"), timevar="ID")
# Date Country ind values.1 values.2 values.3 values.4
# 1 20120101 US Fruit Apple Orange Banana Melon
# 5 20120102 US Fruit Apple Apple Banana <NA>
# 8 20120101 US Favorite Book Knife Watch Water
# 12 20120102 US Favorite Phone Knife Watch <NA>
# 15 20120101 US Money 100 150 80 90
# 19 20120102 US Money 120 130 100 <NA>
他のオプションでまとめると、melt
+dcast
アプローチ (「data.table」または「reshape2」から取得できます) と「dplyr」+「tidyr」アプローチがあります。
library(data.table)
dcast(
suppressWarnings(
melt(as.data.table(mydf), c("Date", "Country", "ID"))),
... ~ ID, value.var = "value")
# Date Country variable 1 2 3 4
# 1: 20120101 US Fruit Apple Orange Banana Melon
# 2: 20120101 US Favorite Book Knife Watch Water
# 3: 20120101 US Money 100 150 80 90
# 4: 20120102 US Fruit Apple Apple Banana NA
# 5: 20120102 US Favorite Phone Knife Watch NA
# 6: 20120102 US Money 120 130 100 NA
library(dplyr)
library(tidyr)
mydf %>%
gather(variable, value, Fruit:Money) %>%
spread(ID, value)
# Date Country variable 1 2 3 4
# 1 20120101 US Fruit Apple Orange Banana Melon
# 2 20120101 US Favorite Book Knife Watch Water
# 3 20120101 US Money 100 150 80 90
# 4 20120102 US Fruit Apple Apple Banana <NA>
# 5 20120102 US Favorite Phone Knife Watch <NA>
# 6 20120102 US Money 120 130 100 <NA>
この回答でmydf
は、次のように定義されています。
mydf <- structure(
list(Date = c(20120101L, 20120101L, 20120101L,
20120101L, 20120102L, 20120102L, 20120102L),
Country = c("US", "US", "US", "US", "US", "US", "US"),
ID = c(1L, 2L, 3L, 4L, 1L, 2L, 3L),
Fruit = c("Apple", "Orange", "Banana", "Melon",
"Apple", "Apple", "Banana"),
Favorite = c("Book", "Knife", "Watch", "Water",
"Phone", "Knife", "Watch"),
Money = c(100L, 150L, 80L, 90L, 120L, 130L, 100L)),
.Names = c("Date", "Country", "ID",
"Fruit", "Favorite", "Money"),
class = "data.frame", row.names = c(NA, -7L))