将两个数据框列堆叠到R

时间:2017-11-22 16:13:14

标签: 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)
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

任务目标:目标是在新数据框中创建一个列,列出a,b,c和d中包含的所有唯一值。

   price   
#1 1
#2 3
#3 4
#4 5
#5 6
...
#12 12

我最初的想法是使用rbind()和unique()......

price<-rbind(df$a,df$b,df$c,df$d)
price<-unique(price)

...期望a,b,c和d垂直叠加。

[Pseudo illustration]
a[1]
a[2]
a[...]
a[n]
b[1]
b[2]
b[...]
b[n]
etc.

相反,&#34;列&#34;被视为行并水平堆叠。

  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使得价格只包含一列(&#34; V1&#34;),其中包含所有20个响应? (我之后可以单独处理的独特部分)。

2)总体目标:更大的图片

最终,我想在每个价格点(由上述独特值定义)中为每个价格(太便宜,讨价还价,昂贵,太贵)创建累计人口份额。例如,有多少百分比的受访者认为1美元太便宜,3美元或更低的百分比太便宜等等。

讨价还价和昂贵的累积份额后来被转换为not.bargain而不是昂贵的四个向量驻留在这样的数据框中:

         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
...

我可以从中绘制一些看起来像这样的东西:

Price Sensitivity Meter Plot

上面,我使用定义的价格桶($ 0.50范围)和hist()函数完成了我的绘图目标。

然而,这些线的交叉点具有意义,我想计算任何线交叉的确切价格。当x轴由价格范围桶而不是特定值定义时,这很困难;因此,希望切换到精确值,并需要生成唯一的价格变量。

[后记:这个分析是基于Peter Van Westendorp的价格敏感度计(https://en.wikipedia.org/wiki/Van_Westendorp%27s_Price_Sensitivity_Meter),它已经知道了实际的局限性,但在我的研究背景下是有用的,它将探讨消费者的看法在不同处理下的价值,而不是定义实际的现实世界价格。我提到这有两个原因:1)在考虑另一种方法的情况下提供对我的目标的更深入的了解,以及2)保持线程专注于机制而不是是否应该使用价格敏感度计。]

1 个答案:

答案 0 :(得分:2)

我们可以unlist将data.frame设为vector并获取sort ed unique元素

sort(unique(unlist(df)))

当我们执行rbind时,会创建matrix unique matrixunique.matrix

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      

循环遍历rows,默认MARGIN为1,然后查找unique个元素。相反,如果我们使用“价格”,则as.vectorc(price)会转换为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