2017-04-26 93 views
0

我設法爲數據集中確定的變量創建屬性標籤,但我使用了一個循環。我想避免使用循環,你能幫助我嗎?在沒有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循環的情況下做到這一點?

回答

3

您可以通過查找要添加「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標籤比您可以通過使用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" 
+0

感謝您的解決方案@Miha,但我想改變什麼虹膜變量的atrribute標籤,不要在名稱末尾添加'newLabels'。如果查看'iris'列的屬性標籤,它們是NULL(例如'attributes(iris $ Sepal.Length)$ label')。儘管如此,也許我可以通過代碼實現這一點,但我必須檢查一下。 – csmontt

+0

@csmontt我更新了我的帖子。請看看它是否對你有幫助。 – Miha

1

下面的代碼將無法正常工作,建於像虹膜數據集,你將不得不在每個數據幀中的功能代碼來修改數據幀的名字你在使用本... 如此說來,在像一個正常的數據幀,例如此一:

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" 
相關問題