如何使用purrr :: map()将cut()分别应用于数据帧的每一行?

时间:2019-11-12 16:16:19

标签: r purrr

我想对数据帧进行某种逐行操作。

目标是使用标签而不是数字创建一个新的数据框-或稍后将转换为数据框的列表。为了得到我想要的东西,我使用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创建

1 个答案:

答案 0 :(得分:1)

以R为底

您可以从base r使用apply函数。此函数将函数应用于数组的行或列。

apply(a_df, 1, cut_modif)

使用purrr::map

当您将数据帧作为参数传递给purrr::map进行迭代时,迭代是按列而不是按行完成的。因此,要执行您想要的操作,我只会看到两个选项:

  1. 将数据框重整为整齐的格式,其中值在行中,变量在列中
a_df = data.frame(t(a_matrix))

map(
  a_df,
  cut_modif
  )
  1. 轻松修改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)
  )