R 宽到长的重复数据

R 宽到长的重复数据,r,R,我正在尝试转换包含宽数据和长数据组合的数据集。目前看起来是这样的: (注意:两边都有许多其他变量,这正是我需要更改的部分) 目前,WTP1和2位于同一行,因为它们与同一参与者(买家)关联。我需要的是有一列的WTP,所以每个买家有两行是相同的,除了WTP值。大概是这样的: 水处理厂 十五 五, 使用unite函数,我几乎找到了一个解决方案,但问题在于这两个值位于同一单元格中,而不是位于各自的行中: library(dplyr) long_Data <- unite(mydata.sub1

我正在尝试转换包含宽数据和长数据组合的数据集。目前看起来是这样的:

(注意:两边都有许多其他变量,这正是我需要更改的部分)

目前,WTP1和2位于同一行,因为它们与同一参与者(买家)关联。我需要的是有一列的WTP,所以每个买家有两行是相同的,除了WTP值。大概是这样的:

水处理厂

十五

五,

使用unite函数,我几乎找到了一个解决方案,但问题在于这两个值位于同一单元格中,而不是位于各自的行中:

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

long_Data这就是你想要的吗

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

只需查看前三行并做出一些假设(添加id和捐赠列)

我建议买家和卖家采用一致的格式:

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

从DF到那里的R码

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]

请重新格式化您的问题(数据)并包含您正在处理的代码。请使用
dput()
(而不是
str
head
或图片/屏幕截图)共享您的数据示例,以便其他人可以提供帮助。如果wtp愿意按单位付款(第一个单位的估价为15美元,第二个单位的估价为5美元),请参阅此处的更多信息。我想您会希望这些行有所区别,而不是“完全相同”。除了第一个/第二个单元,我想您还需要买方/卖方ID作为一个列。@Frank是的,所以我有买方/卖方ID列(我只是没有包括在这里)。我很高兴它们没有区别,只要R始终在下一行中首先列出WTP1的值,然后列出WTP2的值。然后它们不会被明确地标记,但我仍然知道哪一个是第一个可能的复制品:这看起来非常接近!我唯一的问题是如何做到这一点,但不必在开始时输入准确的值,我拥有的数据集超过2000行@我想你是说你有WTP1-WTP1000之类的?这段代码仍然可以正常运行
id.vars
指定不希望移动的行,因此如果左侧有其他值需要与每个WTP值关联,则应将这些值添加到
id.vars
向量中
melt
假设任何不是
id.var
的东西都是
value.var
,这意味着只要WTP是不在
id.var
向量中的唯一列,那么这些将是WTP列中的唯一值。请注意,WTP=
value
,我只是将其重命名以匹配您的示例。@A.J您可能还会发现
data.table
版本的
melt
很有用,就像Frank在他的示例中使用的那样,因为您可以使用正则表达式模式指定度量变量,即
模式(“^WT”)
这可以更容易地分离出您的值/度量变量。这看起来很有希望!正如我问Mako的,有没有办法输入WTA的准确值,WTP1和2,因为这只是一个包含超过2000行的文件的屏幕截图,所以手动输入看起来很简单inefficient@A.J您不需要像Mako和我使用
DF
df1
那样输入精确的值——这些代码只是为了制作一个具体的可复制示例:(理想情况下,您可以在原始问题中使用类似的代码,因此我们不必创建它。)我不确定这是否回答了您的问题。我假设您已经有了数据集
mydata.sub1
。。?
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
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]