【问题标题】:Creating variable names from matrix in R从R中的矩阵创建变量名
【发布时间】:2012-07-10 06:49:46
【问题描述】:

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

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

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

【问题讨论】:

  • 为什么不构建一个包含 5 个 Q 的小测试用例,每个 Q 有 3 个(短)属性?我想知道expand.grid(Qs=unique(questions), attribs =unique(Attributes) ) 是否可以工作....但是您没有说每个问题的 hte 属性是否相同。
  • 很抱歉。我确定是我的错! 540 个变量——每个变量都有 1 个对应的值。

标签: r


【解决方案1】:

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

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)})

【讨论】:

  • 我很抱歉;我不认为我的描述很清楚。问题因属性而异,这就是为什么我需要在转换为长格式之前为每个属性制作单独的变量。更大的问题是问题属性的这些变量需要为我更大的数据集(n = 50,000)的所有受访者进行编码。我已经构建了上述矩阵...
  • 是的!棒极了。步骤 1 完成!然而,接下来我需要做的是将所有 540 个新变量作为列添加到我的数据集中(使用 'cbind()'?>)。然后,我需要将所有受访者编码为该变量的值位于我的 30 x 18 矩阵中。使用上面的示例,我将 (1) 将新变量名称“Attribute2Q_1”绑定到我现有的数据集,然后将所有受访者编码为具有值“1”(位于 [2,1] 或第 2 行第 1 列) .这有意义吗?问题是我现在需要为我的数据集中的每个人输入所有 540 个变量的值!
【解决方案2】:

解决我的问题的代码:

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))

【讨论】:

    猜你喜欢
    • 2015-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多