通过对数据帧进行子集化来设置变量属性

时间:2017-02-12 09:38:42

标签: r

我想通过对数据帧进行子集化并迭代字符向量来设置数据帧中某些变量的属性(“full.name”)。我尝试了两种解决方案,但都不起作用(varsToPrint是包含变量的字符向量,questionLabels是包含问题标签的字符向量):

示例数据:

jtiPrint <- data.frame(question1 = seq(5), question2 = seq(5), question3=seq(5)) 
questionLabels <- c("question1Label", "question2Label") 
varsToPrint <- c("question1", "question2")

解决方案1:

attrApply <- function(var, label) {
  `<-`(attr(var, "full.name"), label)
}
mapply(attrApply, jtiPrint[varsToPrint], questionLabels)

解决方案2:

i <- 1
for (var in jtiPrint[varsToPrint]) {
  attr(var, "full.name") <- questionLabels[i]
  i <- i + 1
}

期望的输出(例如变量1):

attr(jtiPrint$question1, "full.name")
[1] "question1Label"

问题似乎在解决方案2中,R将attritbute设置为仅包含一个变量(索引变量)的新数据帧。但是,我不明白为什么解决方案1不起作用。任何想法如何解决这两种方式中的任何一种?

1 个答案:

答案 0 :(得分:2)

解决方案1 ​​

该函数为'attr<-'而非'<-'(attr...),您还需要设置SIMPLIFY=FALSE(否则返回矩阵而不是列表),然后调用as.data.frame

attrApply <- function(var, label) {
  `attr<-`(var, "full.name", label)
}
df <- as.data.frame(mapply(attrApply,jtiPrint[varsToPrint],questionLabels,SIMPLIFY = FALSE))

> str(df)
    'data.frame':   5 obs. of  2 variables:
 $ question1: atomic  1 2 3 4 5
  ..- attr(*, "full.name")= chr "question1Label"
 $ question2: atomic  1 2 3 4 5
  ..- attr(*, "full.name")= chr "question2Label"

解决方案2

您需要在data.frame的列上设置属性,您要在列的副本上设置属性:

for(i in 1:length(varsToPrint)){
  attr(jtiPrint[[i]],"full.name") <- questionLabels[i]
}

> str(jtiPrint)
'data.frame':   5 obs. of  3 variables:
 $ question1: atomic  1 2 3 4 5
  ..- attr(*, "full.name")= chr "question1Label"
 $ question2: atomic  1 2 3 4 5
  ..- attr(*, "full.name")= chr "question2Label"
 $ question3: int  1 2 3 4 5

无论如何,请注意这两种方法会导致不同的结果。事实上,mapply解决方案会返回上一个data.frame的子集(因此没有第3列),而第二种方法会修改现有的jtiPrint data.frame