我想将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)
}
}
答案 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
转换...