在R中将两个数据帧列堆叠到一个单独的数据帧列中
我将以两种方式提出我的问题。首先,请求任务的解决方案;第二,作为对我总体目标的描述(如果我想得太多,有一个更简单的解决方案) 1)任务解决方案 数据上下文:每行包含四个价格变量(列),表示(a)受访者认为产品太便宜的价格;(b) 被视为讨价还价的价格;(c) 被认为昂贵的价格;(d) 这个价格太贵了,买不起在R中将两个数据帧列堆叠到一个单独的数据帧列中,r,dataframe,R,Dataframe,我将以两种方式提出我的问题。首先,请求任务的解决方案;第二,作为对我总体目标的描述(如果我想得太多,有一个更简单的解决方案) 1)任务解决方案 数据上下文:每行包含四个价格变量(列),表示(a)受访者认为产品太便宜的价格;(b) 被视为讨价还价的价格;(c) 被认为昂贵的价格;(d) 这个价格太贵了,买不起 ## mock data set a<-c(1,5,3,4,5) b<-c(6,6,5,6,8) c<-c(7,8,8,10,9) d<-c(8,10,9,11,12
## mock data set
a<-c(1,5,3,4,5)
b<-c(6,6,5,6,8)
c<-c(7,8,8,10,9)
d<-c(8,10,9,11,12)
df<-as.data.frame(cbind(a,b,c,d))
## result
# a b c d
#1 1 6 7 8
#2 5 6 8 10
#3 3 5 8 9
#4 4 6 10 11
#5 5 8 9 12
我最初的想法是使用rbind()和unique()
相反,“列”被视为行并水平堆叠
V1 V2 V3 V4 V5
1 1 5 3 4 5
2 6 6 5 6 8
3 7 8 8 10 9
4 8 10 9 11 12
如何堆叠a、b、c和d,使price只包含一列(“V1”),其中包含所有二十个响应?(之后我可以单独处理的唯一部分)
2)总体目标:大局
最终,我希望在每个价格点(由上述唯一值定义)为每个价格(太便宜、便宜、昂贵、太昂贵)创建人口的累积份额。例如,百分之多少的受访者认为1美元太便宜,百分之多少的受访者认为3美元或以下太便宜,等等
“便宜”和“昂贵”的累积份额随后被反转为“不便宜”和“不昂贵”,四个向量位于如下数据框中:
buckets too.cheap not.bargain not.expensive too.expensive
1 0.01 to 0.50 0.000000000 1 1 0
2 0.51 to 1.00 0.000000000 1 1 0
3 1.01 to 1.50 0.000000000 1 1 0
4 1.51 to 2.00 0.000000000 1 1 0
5 2.01 to 2.50 0.001041667 1 1 0
6 2.51 to 3.00 0.001041667 1 1 0
...
从中我可以画出这样的东西:
buckets too.cheap not.bargain not.expensive too.expensive
1 0.01 to 0.50 0.000000000 1 1 0
2 0.51 to 1.00 0.000000000 1 1 0
3 1.01 to 1.50 0.000000000 1 1 0
4 1.51 to 2.00 0.000000000 1 1 0
5 2.01 to 2.50 0.001041667 1 1 0
6 2.51 to 3.00 0.001041667 1 1 0
...
上面,我使用定义的价格桶($0.50范围)和hist()函数完成了绘图目标
然而,这些线的交点有一定的意义,我想计算任何一条线交叉的确切价格。当x轴由价格范围而不是特定值定义时,这是很困难的;因此,希望切换到精确值,并需要生成唯一的价格变量
[后记:该分析基于Peter Van Westendorp的价格敏感度表()它知道实际的局限性,但与我的研究相关,我的研究将探索消费者在不同处理方式下的价值感知,而不是定义实际的真实价格。我提到这一点有两个原因:1)为了在想到另一种方法时对我的目标有更深入的了解,2)保持hread关注的是机制,而不是是否应该使用价格敏感度计。]我们可以
将data.frame取消列出向量,并获得排序唯一元素
sort(unique(unlist(df)))
当我们执行rbind
时,它会创建一个矩阵
,并且矩阵的唯一
调用唯一。矩阵
methods('unique')
#[1] unique.array unique.bibentry* unique.data.frame unique.data.table* unique.default unique.IDate* unique.ITime*
#[8] unique.matrix unique.numeric_version unique.POSIXlt unique.warnings
它在行
中循环,因为默认的边距
为1,然后查找唯一的
元素。相反,如果我们使用“价格”,则as.vector
或c(价格)
将转换为vector
sort(unique(c(price)))
#[1] 1 3 4 5 6 7 8 9 10 11 12
如果我们使用unique.default
sort(unique.default(price))
#[1] 1 3 4 5 6 7 8 9 10 11 12
sort(unique(unlist(df)))
谢谢!你的回答很完美,你在我的屏幕刷新之前回答了我的问题!(这让我怀疑我花了多少时间写这么长的帖子:)不过,我非常感谢你花这么多时间写这么长的帖子
sort(unique(c(price)))
#[1] 1 3 4 5 6 7 8 9 10 11 12
sort(unique.default(price))
#[1] 1 3 4 5 6 7 8 9 10 11 12