使用for循环重命名dataframe列元素

使用for循环重命名dataframe列元素,r,for-loop,dataframe,R,For Loop,Dataframe,我想将Anscombe数据集从一个11×8的数据帧重新构造成一个44×3的数据帧,在后者中,列是一个id参数、x的值和y的值。在最后一个数据帧中,我想重命名数据元素,以便“x1”for循环不起作用,因为它在向量的每个元素上迭代,并且R“通过值”而不是“通过引用”起作用,这意味着,如果修改“x”,R将创建一个新的“内存槽”,但不会修改原始向量 只需删除第一个字符,而不是在每一行/元素上循环,这是一种糟糕的做法-使用向量化版本,而不是隐式地“循环”: max.length <- max(nch

我想将Anscombe数据集从一个11×8的数据帧重新构造成一个44×3的数据帧,在后者中,列是一个id参数、x的值和y的值。在最后一个数据帧中,我想重命名数据元素,以便“x1”for循环不起作用,因为它在向量的每个元素上迭代,并且R“通过值”而不是“通过引用”起作用,这意味着,如果修改“x”,R将创建一个新的“内存槽”,但不会修改原始向量

只需删除第一个字符,而不是在每一行/元素上循环,这是一种糟糕的做法-使用向量化版本,而不是隐式地“循环”:

max.length <- max(nchar(as.character(Anscombe$set)))
Anscombe$set2 <- substr(Anscombe$set, 2, max.length) # remove first character
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
一起使用…

您使用哪种熔体<代码>重塑2?如果要基于矢量修改矢量元素,请使用
ifelse
而不是
if
condition@RYoda,来自重塑包。我用ifelse替换了if,但这不起作用。您可以用提供的一些代码向我展示您的建议吗?无需使用
ifelse
,因为我发现了一个更简单的转换逻辑。但是基本上,
ifelse
if
的矢量化版本,不需要循环。例如<代码>Anscombe$set3谢谢你R Yoda!这个解决方案对我来说是有意义的。你能解释一下为什么在这种情况下循环每个行/元素是不好的做法吗?@SHW R中的所有基本数据类型都是向量,如果你循环向量的每个元素并更改它,R会将完整的(!)向量复制到一个新的内存位置,只需修改一个元素。如果在所有元素上循环并修改每个元素,则完整向量将被复制n次(n=向量的大小)。这是一场性能噩梦。因此,几乎所有函数都是“向量化”的,即它们在内部循环,避免多次复制整个向量。重击规则:永远不要在
data.frame
的行上循环,但是在所有列上循环是可以的,因为你可以应用一个向量化函数…好的,谢谢!正如我正确理解的,这是一种效率matter@SHW在这种具体的情况下,性能当然没有问题,但是for循环使代码至少比要求的大,并且不那么优雅。
> 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
> 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 ...