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