【发布时间】:2020-03-08 09:29:50
【问题描述】:
我想对数据框应用特定的逐行操作。
我们的目标是创建一个新的数据框 - 或者我稍后将转换为数据框的列表 - 使用标签而不是数字。为了得到我想要的,我使用purrr::map() 将函数cut() 应用于编号数据框。
我期望一个包含两个对象的列表,每个对象包含 15 个元素。 我得到的是一个包含 15 个对象的列表,每个对象包含 2 个元素。似乎 map 是按列应用的,而不是按行应用的。
下面的代码演示了正在发生的事情。
如何强制操作按行工作?
library(dplyr)
#>
#> Attaching package: 'dplyr'
#> The following objects are masked from 'package:stats':
#>
#> filter, lag
#> The following objects are masked from 'package:base':
#>
#> intersect, setdiff, setequal, union
library(purrr)
a_matrix = matrix(data = sample(100,30),nrow = 2)
a_matrix
#> [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12] [,13]
#> [1,] 72 29 47 9 44 62 73 60 56 85 21 78 100
#> [2,] 16 74 90 34 99 50 7 53 28 38 12 96 40
#> [,14] [,15]
#> [1,] 51 22
#> [2,] 58 52
a_df = data.frame(a_matrix)
a_df
#> X1 X2 X3 X4 X5 X6 X7 X8 X9 X10 X11 X12 X13 X14 X15
#> 1 72 29 47 9 44 62 73 60 56 85 21 78 100 51 22
#> 2 16 74 90 34 99 50 7 53 28 38 12 96 40 58 52
cut_modif = function(x) {
cut(x,
breaks = quantile(x),
labels = c("A", "B", "C", "D"),
include.lowest = T,
right = T
)
}
map(a_df,cut_modif)
#> $X1
#> [1] D A
#> Levels: A B C D
#>
#> $X2
#> [1] A D
#> Levels: A B C D
#>
#> $X3
#> [1] A D
#> Levels: A B C D
#>
#> $X4
#> [1] A D
#> Levels: A B C D
#>
#> $X5
#> [1] A D
#> Levels: A B C D
#>
#> $X6
#> [1] D A
#> Levels: A B C D
#>
#> $X7
#> [1] D A
#> Levels: A B C D
#>
#> $X8
#> [1] D A
#> Levels: A B C D
#>
#> $X9
#> [1] D A
#> Levels: A B C D
#>
#> $X10
#> [1] D A
#> Levels: A B C D
#>
#> $X11
#> [1] D A
#> Levels: A B C D
#>
#> $X12
#> [1] A D
#> Levels: A B C D
#>
#> $X13
#> [1] D A
#> Levels: A B C D
#>
#> $X14
#> [1] A D
#> Levels: A B C D
#>
#> $X15
#> [1] A D
#> Levels: A B C D
由reprex package (v0.3.0) 于 2019 年 11 月 12 日创建
【问题讨论】:
-
对于逐行操作,请参阅
purrr::pmap()。 -
我试过
purrr::pmap()但也无济于事。 @aosmith