我将以两种方式提出我的问题。首先,请求任务的解决方案;第二,作为对我总体目标的描述(如果我过度思考这个并且有一个更容易的解决方案)。
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
...
我可以从中绘制一些看起来像这样的东西:
上面,我使用定义的价格桶($ 0.50范围)和hist()函数完成了我的绘图目标。
然而,这些线的交叉点具有意义,我想计算任何线交叉的确切价格。当x轴由价格范围桶而不是特定值定义时,这很困难;因此,希望切换到精确值,并需要生成唯一的价格变量。
[后记:这个分析是基于Peter Van Westendorp的价格敏感度计(https://en.wikipedia.org/wiki/Van_Westendorp%27s_Price_Sensitivity_Meter),它已经知道了实际的局限性,但在我的研究背景下是有用的,它将探讨消费者的看法在不同处理下的价值,而不是定义实际的现实世界价格。我提到这有两个原因:1)在考虑另一种方法的情况下提供对我的目标的更深入的了解,以及2)保持线程专注于机制而不是是否应该使用价格敏感度计。]
答案 0 :(得分:2)
我们可以unlist
将data.frame设为vector
并获取sort
ed unique
元素
sort(unique(unlist(df)))
当我们执行rbind
时,会创建matrix
unique
matrix
次unique.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.vector
或c(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