【发布时间】:2015-04-20 17:24:06
【问题描述】:
我有一个看起来像这样的数据集:
有:
data have;
input a b c d e f g h ;
datalines;
1 0 0 0 0 0 1 0
0 0 1 0 1 0 0 0
0 0 0 1 0 1 0 0
0 1 0 0 0 0 0 1
;
run;
a、b、c 和 d 列是问题 1 的四个选项,采用 4 分制。 obs1 列 A 中的值“1”表示受访者已为该问题选择了选项 A,表示 4 分制中的 4。
a = 4,b = 3,c = 2 和 d = 1。
下一个问题的选项是 e、f、g 和 h。受访者选择了选项 g,即 4 分制中的 2。 e = 4,f = 3,g = 2 和 h = 1。
数据集包含数百个这样的列。我的想法是将 4 列合并为一列,得到如下值:“1000”、“0100”、“0010”、“0001”,然后转换 1000 = 4、0100 = 3、0010 = 2 和 0001 = 1。
我希望它是这样的:
block col1 col2 col3 col4
1 1000 0100 0010 0001
2 0100 0010 1000 0001
3 1000 0100 1000 0010
我已经走到这一步了:
proc transpose data = have out = have_t;
run;
data have_t_block;
set have_t;
retain block;
if _n_ = 1 then block = 1;
if mod(_n_/4,1) = 0.25 and _n_ gt 1 then block +1;
run;
有没有办法在 SAS 中按块聚合时连接行值?我在 R 中这样做,如下所示:
#Create data
data <- data.frame(a = c(1, 0, 0), b = c(0, 1, 0), c = c(0, 0, 1), d = c(0, 0, 0), e = c(0, 1, 0), f = c(1, 0, 0), g = c(0, 0, 1), h = c(0, 0, 0), i = c(0, 0, 1), j = c(1, 0, 0), k = c(0, 0, 0), l = c(0, 1, 0))
#transpose
data <- data.frame(t(data))
#create a key for each group of 4
data$block <- rep(1:(nrow(data)/4), each = 4)
#convert data to long format and group by key (block) and use paste to concatenate
require(reshape2)
data_melt <- melt(data, id = c("block"))
trial <- data.frame(t(dcast(data_melt, block ~ variable, paste, collapse = "")))
【问题讨论】:
-
连接行值是什么意思。您的意思是将四个变量连接成一个 4 字符长的字符串吗?
-
另外 - 至少对我来说,你如何从 HAVE 到 WANT 并不明显。有什么关系?想要的输出的哪些部分来自原始的 HAVE?
-
好的,让我在问题中提供一些背景信息。
-
是的,将 4 个变量连接成一个 4 字符长的字符串。我已经编辑了问题以解释这种关系。
标签: sas concatenation aggregate-functions