我是R的新手,并试图在数据集中创建一些新变量(“数据”)。
在此数据集中,列是对问题是否得到回答的二分法编码。问题编号用下标(“Q_1,”Q_2“)表示。每个问题都有几个属性,我想使用相同的下标命名(即”Q_Attribute1_1“,”Q_Attribute2_1“),因为我需要重新设置由于我总共有30个问题,每个都有18个问题级别的属性,因此手动创建540个变量(30x18)似乎并不聪明。另外一个问题是,每个问题都与单个值,例如0/1。
创建了两个向量 - 一个具有变量名称,另一个具有关联值 - 我需要将每个唯一变量名称作为列添加到更大的数据集(“main” .data“)有20,000个案例。我希望此变量的值与上面针对所有案例的数据中列出的值相同。这怎么可能实现?
答案 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))