使用dplyr对每一行应用函数的方法(附实例)

147 阅读2分钟

你可以使用下面的基本语法,在R中使用来自dplyr的函数对数据框中的每一行应用一个函数

df %>%
  rowwise() %>% 
  mutate(mean_value = mean(c(col1, col2, col3), na.rm=TRUE))

这个特殊的例子计算了数据框中每一行的col1col2col3的平均值,但是你可以用任何你想计算不同指标的函数来替换mean()函数。

下面的例子展示了如何在实践中使用这个语法,下面的数据框包含了不同篮球运动员在不同比赛中的得分信息。

#create data frame
df <- data.frame(game1=c(22, 25, 29, 13, 22, 30),
                 game2=c(12, 10, 6, 6, 8, 11),
                 game3=c(NA, 15, 15, 18, 22, 13))

#view data frame
df

  game1 game2 game3
1    22    12    NA
2    25    10    15
3    29     6    15
4    13     6    18
5    22     8    22
6    30    11    13

例子1:每行中特定列的平均值

下面的代码显示了如何计算数据框中每一行的game1game3列的均值:

library(dplyr)

#calculate mean of game1 and game3
df %>%
  rowwise() %>% 
  mutate(mean_points = mean(c(game1, game3), na.rm=TRUE))

# A tibble: 6 x 4
# Rowwise: 
  game1 game2 game3 mean_points
           
1    22    12    NA        22  
2    25    10    15        20  
3    29     6    15        22  
4    13     6    18        15.5
5    22     8    22        22  
6    30    11    13        21.5

从输出结果中我们可以看到:

  • 第一行中game1和game3的均值是22
  • 第二行中game1和game3的平均值是20
  • 第三行的游戏1和游戏3的平均值是22

以此类推。

例2:每行中特定列的最大值

下面的代码显示了如何计算数据框中每一行的game2game3列的最大值:

library(dplyr)

#calculate max of game2 and game3
df %>%
  rowwise() %>% 
  mutate(max_points = max(c(game2, game3), na.rm=TRUE))

# A tibble: 6 x 4
# Rowwise: 
  game1 game2 game3 max_points
          
1    22    12    NA         12
2    25    10    15         15
3    29     6    15         15
4    13     6    18         18
5    22     8    22         22
6    30    11    13         13

从输出结果中我们可以看到:

  • 第一行中game2和game3的最大值是12
  • 第二行中game2和game3的最大值是15
  • 第三行中game2和game3的最大值是15

以此类推

例3:每行中特定列的标准偏差

下面的代码显示了如何计算数据框中每一行的game2game3列数值的标准差:

library(dplyr)

#calculate standard deviation of game2 and game3
df %>%
  rowwise() %>% 
  mutate(sd_points = sd(c(game2, game3), na.rm=TRUE))

# A tibble: 6 x 4
# Rowwise: 
  game1 game2 game3 sd_points
         
1    22    12    NA     NA   
2    25    10    15      3.54
3    29     6    15      6.36
4    13     6    18      8.49
5    22     8    22      9.90
6    30    11    13      1.41

从输出结果中我们可以看到:

  • 第一行中game2和game3的标准差是NA(因为标准差不能只从一个值计算)
  • 第二行中game2和game3的标准差是3.54
  • 第一行中的游戏2和游戏3的标准差是6.36

以此类推

注意:你可以在这里找到dplyr中rowwise()函数的完整文档。

其他资源

下面的教程解释了如何使用dplyr执行其他常见任务:

如何使用dplyr计算不同的值
如何使用dplyr进行多列求和
如何使用dplyr替换数据框中的多个值