在没有for循环的情况下重新标记多列标签属性

时间:2017-04-26 18:27:08

标签: r attributes

我设法为数据集中确定的变量创建属性标签,但我使用了循环。我想避免使用循环,你能帮助我吗?

这是一个带有虹膜数据集的玩具示例。

假设我想在“Sepal.length”,“Petal.width”和“Species”变量中添加属性标签。我做的是以下内容:

1)创建了一个带有我要添加属性的变量名称的向量。

varNames <- c("Sepal.Length", "Petal.Width", "Species")

2)使用我想要添加的标签

创建了一个字符向量
newLabels <- c("a", "b", "c")

3)然后,创建一个for循环来完成为其分配属性标签的任务 选定的变量。

for (i in 1:length(varNames)) {
attributes(iris[[which(names(iris) %in% varNames[i])]])$label <-  
newLabels[i]
}  

如果没有for循环,我怎么能这样做?

2 个答案:

答案 0 :(得分:3)

您可以通过查找要添加的列来实现这一目标&#34; a&#34;,&#34; b&#34;和&#34; c&#34;并使用%in%,并附加适当的标记。

# Your vector
  varNames <- c("Sepal.Length", "Petal.Width", "Species")
# Use names() to append
  names(newLabels) <- c("a", "b", "c")

附加适当标签的代码

names(iris)[names(iris) %in% varNames] <- paste(names(iris)[names(iris) %in% varNames], names(newLabels), sep = ".")

# And output
> names(iris)
[1] "Sepal.Length.a" "Sepal.Width"    "Petal.Length"   "Petal.Width.b"  "Species.c" 

更新帖子

我想更改iris变量的atrribute标签,而不是通过使用lapplylabel来实现这一目标

  varNames = c(Sepal.Length="a", Petal.Width="b",Species="c")

  # Apply to each value of varNames 
  label(iris[c("Sepal.Length", "Petal.Width", "Species")]) = lapply(names(varNames), 
                          function(x) label(iris[,x]) = varNames[x])

输出

> attributes(iris$Sepal.Length)$label
Sepal.Length 
         "a" 
> attributes(iris$Petal.Width)$label
Petal.Width 
        "b" 
> attributes(iris$Species)$label
Species 
    "c" 

答案 1 :(得分:1)

以下代码不适用于像iris这样的内置数据集,您必须修改功能代码中的数据框名称,以用于您使用此功能的每个数据框... 话虽如此,在正常的数据框架上,例如这一个:

dta=data.frame(SL=c(1,2,3,4,5),SW=c(6,7,8,9,10),PL=c(11,12,13,14,15),PW=c(16,17,18,19,20),Spe=c("f","g","h","i","j"))

有类似的附加信息:

varNames <- c("SL", "PW", "Spe")
newLabels <- c("a", "b", "c")

这是一种无循环的方法:

fu=function(i){  
attributes(dta[[which(names(dta) %in% varNames[i])]])$label <<- newLabels[i]
}
mapply(fu,1:length(varNames))

验证第一个标签:

> attributes(dta[[1]])$label
[1] "a"