在R中从矩阵创建变量名

时间:2012-07-10 18:11:09

标签: r

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

在此数据集中,列是对问题是否得到回答的二分法编码。问题编号用下标(“Q_1,”Q_2“)表示。每个问题都有几个属性,我想使用相同的下标命名(即”Q_Attribute1_1“,”Q_Attribute2_1“),因为我需要重新设置由于我总共有30个问题,每个都有18个问题级别的属性,因此手动创建540个变量(30x18)似乎并不聪明。另外一个问题是,每个问题都与单个值,例如0/1。

创建了两个向量 - 一个具有变量名称,另一个具有关联值 - 我需要将每个唯一变量名称作为添加到更大的数据集(“main” .data“)有20,000个案例。我希望此变量的值与上面针对所有案例的数据中列出的值相同。这怎么可能实现?

2 个答案:

答案 0 :(得分: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)})

答案 1 :(得分:-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))