分配 lapply 输出时括号 [] 做什么

Sum*_*Kim 1 r apply lapply

我有一个变量v如下:

> head(v)
    C1   C2   C3   C4   C5   C6   C7   C8   C9  C10
1 0.m2 0.m2 0.m2 0.m2 0.m2 0.m2 0.m2 0.m2 0.m2 0.m2
2 0.m1 0.m1 0.m1 0.m1 0.m1 0.m1 0.m1 0.m1 0.m1 0.m1
3 0.p1 0.p1 0.p1 0.p1 0.p1 0.p1 0.p1 0.p1 0.p1 0.p1
4 0.m1 0.m1 0.m1 0.m1 0.m1 0.m1 0.m1 0.m1 0.m1 0.m1
5 0.m2 0.m2 0.m2 0.m2 0.m2 0.m2 0.m2 0.m2 0.m2 0.m2
6 0.m2 0.m2 0.m2 0.m2 0.m2 0.m2 0.m2 0.m2 0.m2 0.m2
Run Code Online (Sandbox Code Playgroud)

我想利用数据帧的每个元素的尾随“.m1”。

当我执行 lapply 时,它会给我一个 C1、C2 的列表,...

> lapply(v, function(x) as.numeric(gsub("\\..*", "", x))) %>% str
List of 10
 $ C1 : num [1:40000] 0 0 0 0 0 0 0 0 0 0 ...
 $ C2 : num [1:40000] 0 0 0 0 0 0 0 0 0 0 ...
 $ C3 : num [1:40000] 0 0 0 0 0 0 0 0 0 0 ...
 $ C4 : num [1:40000] 0 0 0 0 0 0 0 0 0 0 ...
 $ C5 : num [1:40000] 0 0 0 0 0 0 0 0 0 0 ...
 $ C6 : num [1:40000] 0 0 0 0 0 0 0 0 0 0 ...
 $ C7 : num [1:40000] 0 0 0 0 0 0 0 0 0 0 ...
 $ C8 : num [1:40000] 0 0 0 0 0 0 0 0 0 0 ...
 $ C9 : num [1:40000] 0 0 0 0 0 0 0 0 0 0 ...
 $ C10: num [1:40000] 0 0 0 0 0 0 0 0 0 0 ...
Run Code Online (Sandbox Code Playgroud)

但是,我想要一个尺寸保持不变的数据框,所以我执行以下操作并且它有效

> v[]=lapply(v, function(x) as.numeric(gsub("\\..*", "", x)))
> head(v)
  C1 C2 C3 C4 C5 C6 C7 C8 C9 C10
1  0  0  0  0  0  0  0  0  0   0
2  0  0  0  0  0  0  0  0  0   0
3  0  0  0  0  0  0  0  0  0   0
4  0  0  0  0  0  0  0  0  0   0
5  0  0  0  0  0  0  0  0  0   0
6  0  0  0  0  0  0  0  0  0   0
Run Code Online (Sandbox Code Playgroud)

是否需要 [] 来改变 v 的每个元素?有更好的方法来编码吗?谢谢。

r2e*_*ans 6

  • v是 a data.frame,它本质上(但不完美)是 a ,list其中所有元素都被命名且长度相同。
  • lapply总是返回一个list. 时期。它不关心它的输入来自 a frame,这不是它的意图。
  • v = lapply(..)替换用新对象命名的对象引用"v",即(如上所述) a list。然而 ...
  • v[] = lapply(..)将 的内容替换为 from的v返回值,lapply(..)而不更改 的类和属性v,因此它仍然是一个包含 的返回列表内容的框架lapply。意识到使用 也可以达到同样的效果v = data.frame(lapply(..))