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