我想对数据帧进行某种逐行操作。
目标是使用标签而不是数字创建一个新的数据框-或稍后将转换为数据框的列表。为了得到我想要的东西,我使用cut()
将函数purrr::map()
应用于编号的数据帧。
我期望一个包含两个对象的列表,每个对象包含15个元素。 我得到的是一个包含15个对象的列表,每个对象包含2个元素。似乎地图是按列而不是按行应用的。
下面的代码演示了正在发生的事情。
如何强制操作按行进行?
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创建
答案 0 :(得分:1)
以R为底
您可以从base r使用apply
函数。此函数将函数应用于数组的行或列。
apply(a_df, 1, cut_modif)
使用purrr::map
当您将数据帧作为参数传递给purrr::map
进行迭代时,迭代是按列而不是按行完成的。因此,要执行您想要的操作,我只会看到两个选项:
a_df = data.frame(t(a_matrix))
map(
a_df,
cut_modif
)
cut_modf
函数以将行索引作为参数a_df = data.frame(a_matrix)
cut_modif = function(.df, row) {
x <- .df[row, ] %>% as.numeric()
cut(x,
breaks = quantile(x),
labels = c("A", "B", "C", "D"),
include.lowest = T,
right = T
)
}
map(
1:nrow(a_df),
~cut_modif(.df = a_df, row = .x)
)