我设法为数据集中确定的变量创建属性标签,但我使用了循环。我想避免使用循环,你能帮助我吗?
这是一个带有虹膜数据集的玩具示例。
假设我想在“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循环,我怎么能这样做?
答案 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标签,而不是通过使用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"
答案 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"