使用for循环重命名数据框列元素

时间:2017-07-22 09:57:58

标签: r for-loop dataframe

我想将Anscombe数据集从11 x 8数据帧重组为44 x 3数据帧,其中后者列是id参数,x的值和y的值。在最后的数据帧中,我想重命名数据元素,以便“x1”< - 1,“x2”< - 2等等。我试图用for循环来做这个,但它不起作用。

任何人都可以向我解释为什么for循环不起作用?

此外,还有更有效的重命名方法吗?

install.packages("datasets"); library(datasets)
anscombe_long <- melt(anscombe, 
             measured = c("x1", "x2", "x3", "x4", "y1", "y2", "y3", "y4")) #from wide to long

anscombe_x <- subset(anscombe_long, variable == c("x1", "x2", "x3", "x4")) #separate x and y observations
anscombe_y <- subset(anscombe_long, variable == c("y1", "y2", "y3", "y4"))

Anscombe <- cbind(anscombe_x, anscombe_y$value) #combine into one dataframe

colnames(Anscombe) <- c("set", "x", "y") #change column names

for(x in Anscombe$set) {
  if(x == "x1") {
    x <- factor(1)
  } else if (x == "x2") {
   x <- factor(2)
  } else if (x == "x3") {
    x <- factor(3)
  } else {
   x <- factor(4)
  }
}

1 个答案:

答案 0 :(得分:1)

for循环不起作用,因为它遍历向量的每个元素而R确实“按值”工作,而不是“按引用”工作,这意味着,如果你修改“x”R创建一个新的“内存插槽”,但修改原始矢量。

删除第一个字符而不是循环遍历每个行/元素,这是BTW不好的做法 - 使用向量化版本而不是隐式“循环”:

max.length <- max(nchar(as.character(Anscombe$set)))
Anscombe$set2 <- substr(Anscombe$set, 2, max.length) # remove first character

结果是一个字符类型(我没有触及set,所以你可以看到差异):

> Anscombe
   set  x     y set2
1   x1 10  8.04    1
5   x1 11  8.33    1
9   x1 12 10.84    1
14  x2 13  8.74    2
18  x2  6  6.13    2
22  x2  5  4.74    2
23  x3 10  7.46    3
27  x3 11  7.81    3
31  x3 12  8.15    3
36  x4  8  7.71    4
40  x4  8  5.25    4
44  x4  8  6.89    4

PS:另请注意Anscombe$set是内部使用数字的因子类型(不是字符串),请参阅:

> str(Anscombe)
'data.frame':   12 obs. of  4 variables:
 $ set : Factor w/ 8 levels "x1","x2","x3",..: 1 1 1 2 2 2 3 3 3 4 ...
 $ x   : num  10 11 12 13 6 5 10 11 12 8 ...
 $ y   : num  8.04 8.33 10.84 8.74 6.13 ...

这就是为什么我使用上面的as.character转换...