Широкие и длинные данные с дублированием - PullRequest
0 голосов
/ 02 июля 2018

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

picture of data

(примечание: по обе стороны есть много других переменных, это просто сегмент, который мне нужно изменить)

В настоящее время WTP1 и 2 находятся в одной строке, поскольку они связаны с одним и тем же участником (покупателями). Мне нужно, чтобы для WTP был один столбец, чтобы у каждого покупателя было две строки, которые идентичны, кроме значения WTP. Примерно так:

WTP

15

5

Я почти достиг решения, используя функцию unite, но проблема здесь в том, что два значения находятся в одной ячейке, а не в своих собственных строках:

library(dplyr) 
long_Data <- unite(mydata.sub1,WTP,player.WTP1:player.WTP2, sep = "_", remove= TRUE)

unite function output

Я уверен, что есть простое решение, но я новичок! любые предложения приветствуются. ТИА

Ответы [ 2 ]

0 голосов
/ 02 июля 2018

Просто посмотрите на ваши первые три строки и сделайте некоторые предположения (добавив столбцы id и endowment) ...

DF = data.frame(
  id = 1:3, 
  endowment = c(0L, 1L, 1L), 
  WTA = c(NA, 20, 10), 
  WTP.1 = c(15, NA, NA), 
  WTP.2 = c(5, NA, NA)
)

  id endowment WTA WTP.1 WTP.2
1  1         0  NA    15     5
2  2         1  20    NA    NA
3  3         1  10    NA    NA

Я бы порекомендовал форматировать это последовательно для покупателей и продавцов:

prefs = data.frame(id = rep(1:3, c(2,1,1)), quantity = c(1L,2L,-1L,-1L), valuation = c(15,20,-20,-10))

  id quantity valuation
1  1        1        15
2  1        2        20
3  2       -1       -20
4  3       -1       -10

players = data.frame(id = 1:3, endowment = c(0L, 1L, 1L))

  id endowment
1  1         0
2  2         1
3  3         1

R-код, который я бы использовал, чтобы получить от DF ...

library(data.table)
players = DF[, c("id", "endowment")]

prefs = melt(data.table(DF), id = "id", measure.vars = patterns("^WT"), na.rm = TRUE) 

# translate
prefs[variable == "WTA", `:=`(quantity = -1L, valuation = -value)]
prefs[variable %like% "WTP", `:=`(quantity = 1:.N, valuation = cumsum(value)), by=id]

# clean up
prefs[, c("variable", "value") := NULL]
0 голосов
/ 02 июля 2018

Это то, что вы ищете?

df1 <- data.frame(
    player.WTA = c(NA,20,10,NA,10,5,NA),
    player.WTP1 = c(15,NA,NA,15,NA,NA,15),
    player.WTP2 = c(5,NA,NA,5,NA,NA,5)
)

require(reshape2)

melt(df1, id.var="player.WTA", value.name="WTP")

   player.WTA    variable WTP
1          NA player.WTP1  15
2          20 player.WTP1  NA
3          10 player.WTP1  NA
4          NA player.WTP1  15
5          10 player.WTP1  NA
6           5 player.WTP1  NA
7          NA player.WTP1  15
8          NA player.WTP2   5
9          20 player.WTP2  NA
10         10 player.WTP2  NA
11         NA player.WTP2   5
12         10 player.WTP2  NA
13          5 player.WTP2  NA
14         NA player.WTP2   5

И если вы просто хотите увидеть значения не-NA:

require(dplyr)

melt(df1, id.var="player.WTA", value.name="WTP") %>% filter(WTP != 'NA')

  player.WTA    variable WTP
1         NA player.WTP1  15
2         NA player.WTP1  15
3         NA player.WTP1  15
4         NA player.WTP2   5
5         NA player.WTP2   5
6         NA player.WTP2   5
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...