0

我是 R 新手,并试图在数据集(“数据”)中创建许多新变量。

在这个数据集中,这些列是问题是否被回答的二分编码。问题编号用下标表示(“Q_1”、“Q_2”)。每个问题都有几个属性,我想使用相同的下标(即“Q_Attribute1_1”、“Q_Attribute2_1”)来命名,因为我需要重塑将数据转换成多级分析的长格式。但是因为我总共有 30 个问题,每个问题都有 18 个问题级别的属性,所以手动创建 540 个变量(30x18)似乎并不聪明。另外一个问题是,每个问题都与单个值,例如 0/1。

创建了两个向量(一个带有变量名称,一个带有关联值)后,我需要将每个唯一变量名称作为添加到包含 20,000 个案例的更大数据集(“main.data”)中。我希望这个变量的值与上面数据中列出的所有情况下的值相同。这将如何实施?

4

2 回答 2

0

你能不能把你的数据放在一个数据框中:

data<-matrix(rbinom(18*30,1,.5),nrow=18,ncol=30)
questions<-paste("Q",1:30,sep="_")
attributes<-paste("Attribute",1:18,sep="")
df<-data.frame(data,row.names=attributes)
names(df)<-questions

然后您可以访问所有 Q_1 答案:

> df[,'Q_1']
 [1] 0 1 0 1 1 1 1 0 1 1 0 0 1 1 1 0 1 1

所有具有属性 2 的问题:

> df['Attribute2',]
           Q_1 Q_2 Q_3 Q_4 Q_5 Q_6 Q_7 Q_8 Q_9 Q_10 Q_11 Q_12 Q_13 Q_14 Q_15
Attribute2   1   0   0   0   1   1   0   1   0    1    1    1    1    1    0
           Q_16 Q_17 Q_18 Q_19 Q_20 Q_21 Q_22 Q_23 Q_24 Q_25 Q_26 Q_27 Q_28
Attribute2    1    1    1    0    0    1    1    0    1    0    0    1    1
           Q_29 Q_30
Attribute2    1    0

或问题 1 属性 18

> df['Attribute1','Q_18']
[1] 1

编辑:

如果您只想创建 540 个变量,那么:

test<-paste("Q_Attribute",c(1:18),sep="")
test<-c(sapply(test,function(x,y){paste(x,y,sep="_")},y=c(1:30)))
lapply(test,function(x){assign(x,NA,envir = .GlobalEnv)})
于 2012-07-10T19:04:22.363 回答
-1

解决我的问题的代码:

You may use "melt" function in reshape2 package to transform the data to 
long format. Hope the following example helps! 
> set.seed(1) 
> data <- matrix(rbinom(15, size = 1, 0.5), 3, 5) 
> colnames(data) <-  paste("attribute", 1 : 5, sep = "") 
> data <- data.frame(question = 1 : 3, data) 
> data

  question attribute1 attribute2 attribute3 attribute4 attribute5 
1        1          0          1          1          0          1 
2        2          0          0          1          0          0 
3        3          1          1          1          0          1 
> library(reshape2) 
> melt(data, "question") 


  question   variable value 
1         1 attribute1     0 
2         2 attribute1     0 
3         3 attribute1     1 
4         1 attribute2     1 
5         2 attribute2     0 
6         3 attribute2     1 
7         1 attribute3     1 
8         2 attribute3     1 
9         3 attribute3     1 
10        1 attribute4     0 
11        2 attribute4     0 
12        3 attribute4     0 
13        1 attribute5     1 
14        2 attribute5     0 
15        3 attribute5     1 `

#Then, concatenate two variables into a unique name.
> data_long$varnames <-paste(data_long$variable, data_long$W1Qs, sep="")  

#Next, create a vector of all of the unique variable names
> myvars <-c(data_long$varnames)
#Also create a vector of the values corresponding to the unique variable names
> myvalues <-c(data_long$value)

#Then, just add in use the vector of var names to create new columns in main dataset
> main.data[myvars] <-0
#Replace the values assigned to those columns FOR ALL ROWS with the values in 2nd vector
> main.data=rep(myvalues, each=NROW(main.data))
于 2012-07-11T16:11:39.290 回答