在没有for循环的情况下重新标记多列标签属性
问题描述:
我设法为数据集中确定的变量创建属性标签,但我使用了一个循环。我想避免使用循环,你能帮助我吗?在没有for循环的情况下重新标记多列标签属性
下面是一个带有虹膜数据集的玩具示例。假设我想为“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循环的情况下做到这一点?
答
您可以通过查找要添加“a”,“b”和“c”的列并在%中使用%并添加适当的标记来完成。
# 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"
更新的帖子
我要改变虹膜变量的atrribute标签比您可以通过使用lapply
和label
像实现这一目标此
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"
答
下面的代码将无法正常工作,建于像虹膜数据集,你将不得不在每个数据帧中的功能代码来修改数据帧的名字你在使用本... 如此说来,在像一个正常的数据帧,例如此一:
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"
感谢您的解决方案@Miha,但我想改变什么虹膜变量的atrribute标签,不要在名称末尾添加'newLabels'。如果查看'iris'列的属性标签,它们是NULL(例如'attributes(iris $ Sepal.Length)$ label')。尽管如此,也许我可以通过代码实现这一点,但我必须检查一下。 – csmontt
@csmontt我更新了我的帖子。请看看它是否对你有帮助。 – Miha