R 在存储在多列上的数据框中查找值

R 在存储在多列上的数据框中查找值,r,loops,lookup,R,Loops,Lookup,我试图计算演员们为电影创造的平均收入。在我的数据集中,这是由gross定义的,如下面的代码片段所示: movie_title actor_1_name actor_2_name actor_3_name ... gross x Christoph Waltz Johnny Depp Emma Stone x 309404152 x Mark Addy Christopher Lee Naom

我试图计算演员们为电影创造的平均收入。在我的数据集中,这是由gross定义的,如下面的代码片段所示:

movie_title  actor_1_name     actor_2_name     actor_3_name  ...  gross
x            Christoph Waltz  Johnny Depp      Emma Stone    x    309404152
x            Mark Addy        Christopher Lee  Naomi Watts   x    73058679 
x            Will Smith       Tom Hanks        *NA*          x    179020854
x            Tony Curran      Jeremy Renner    Matt Damon    x    93417865
x            Chris Evans      Eva Green        *NA*          x    85313679
..etc  
我做的第一件事是将三个actor_X_name列转换为一列唯一的actor name,如下所示:

actors <- unique(data.frame(actor_name = c(df[,"actor_1_name"], df[,"actor_2_name"], df[,"actor_3_name"])))
上面返回一个新的数据帧,其中包含来自原始数据集的唯一参与者名称的单列

我如何才能最好地通过这些4900个观察值进行交互,在原始数据框中查找actor_X_name的3个条件的值?目标是获取匹配行的总值,以便我可以据此进行计算。

给定您的输入:

df <- tibble::tribble(~title, ~actor_1_name, ~actor_2_name, ~actor_3_name, ~gross,
                      "A", "Christoph Waltz",  "Johnny Depp",      "Emma Stone",    309404152,
                      "B", "Mark Addy",        "Christopher Lee",  "Naomi Watts",   73058679 ,
                      "C", "Will Smith",       "Tom Hanks",        NA,            179020854,
                      "D", "Tony Curran",      "Jeremy Renner",    "Matt Damon",    93417865,
                      "E", "Chris Evans",      "Eva Green",        NA,           85313679)
df
#> # A tibble: 5 x 5
#>   title actor_1_name    actor_2_name    actor_3_name     gross
#>   <chr> <chr>           <chr>           <chr>            <dbl>
#> 1 A     Christoph Waltz Johnny Depp     Emma Stone   309404152
#> 2 B     Mark Addy       Christopher Lee Naomi Watts   73058679
#> 3 C     Will Smith      Tom Hanks       NA           179020854
#> 4 D     Tony Curran     Jeremy Renner   Matt Damon    93417865
#> 5 E     Chris Evans     Eva Green       NA            85313679
使用匹配项可以选择所有以这种方式编写的列

使用pivot_执行的操作是重塑数据的形状,使匹配项选择的列成为一列,并对每行重复其他列的内容

标题和总额将作为每行的唯一标识符

如果需要计算每个参与者的平均毛额,可以使用:

library(tidyr)
library(dplyr)

df %>% 
 pivot_longer(matches("actor_\\d_name"), values_to = "actor_name") %>% 
 filter(!is.na(actor_name)) %>% 
 group_by(actor_name) %>% 
 summarise(mean_gross = mean(gross), .groups = "drop")
#> # A tibble: 14 x 2
#>    actor_name      mean_gross
#>    <chr>                <dbl>
#>  1 Chris Evans      85313679 
#>  2 Christoph Waltz 309404152 
#>  3 Christopher Lee  73058679 
#>  4 Emma Stone      309404152 
#>  5 Eva Green        85313679 
#>  6 Jeremy Renner    93417865 
#>  7 Johnny Depp     309404152 
#>  8 Mark Addy        73058679 
#>  9 Matt Damon       93417865 
#> 10 Naomi Watts      73058679 
#> 11 Tom Hanks       179020854 
#> 12 Tony Curran      93417865 
#> 13 Will Smith      179020854 
注意,我过滤掉了NAs,因为它们没有任何意义。 此外,在pivot_longer中,我定义了我创建的新列的名称,以便更具可读性并与您的意图一致。

考虑到您的输入:

df <- tibble::tribble(~title, ~actor_1_name, ~actor_2_name, ~actor_3_name, ~gross,
                      "A", "Christoph Waltz",  "Johnny Depp",      "Emma Stone",    309404152,
                      "B", "Mark Addy",        "Christopher Lee",  "Naomi Watts",   73058679 ,
                      "C", "Will Smith",       "Tom Hanks",        NA,            179020854,
                      "D", "Tony Curran",      "Jeremy Renner",    "Matt Damon",    93417865,
                      "E", "Chris Evans",      "Eva Green",        NA,           85313679)
df
#> # A tibble: 5 x 5
#>   title actor_1_name    actor_2_name    actor_3_name     gross
#>   <chr> <chr>           <chr>           <chr>            <dbl>
#> 1 A     Christoph Waltz Johnny Depp     Emma Stone   309404152
#> 2 B     Mark Addy       Christopher Lee Naomi Watts   73058679
#> 3 C     Will Smith      Tom Hanks       NA           179020854
#> 4 D     Tony Curran     Jeremy Renner   Matt Damon    93417865
#> 5 E     Chris Evans     Eva Green       NA            85313679
使用匹配项可以选择所有以这种方式编写的列

使用pivot_执行的操作是重塑数据的形状,使匹配项选择的列成为一列,并对每行重复其他列的内容

标题和总额将作为每行的唯一标识符

如果需要计算每个参与者的平均毛额,可以使用:

library(tidyr)
library(dplyr)

df %>% 
 pivot_longer(matches("actor_\\d_name"), values_to = "actor_name") %>% 
 filter(!is.na(actor_name)) %>% 
 group_by(actor_name) %>% 
 summarise(mean_gross = mean(gross), .groups = "drop")
#> # A tibble: 14 x 2
#>    actor_name      mean_gross
#>    <chr>                <dbl>
#>  1 Chris Evans      85313679 
#>  2 Christoph Waltz 309404152 
#>  3 Christopher Lee  73058679 
#>  4 Emma Stone      309404152 
#>  5 Eva Green        85313679 
#>  6 Jeremy Renner    93417865 
#>  7 Johnny Depp     309404152 
#>  8 Mark Addy        73058679 
#>  9 Matt Damon       93417865 
#> 10 Naomi Watts      73058679 
#> 11 Tom Hanks       179020854 
#> 12 Tony Curran      93417865 
#> 13 Will Smith      179020854 
注意,我过滤掉了NAs,因为它们没有任何意义。 此外,在pivot\u longer中,我定义了我创建的新列的名称,以便更具可读性并与您的意图保持一致。

使用平均df%>%pivot\u longerstarts\u with Actor%>%SummarySeavg=meangross使用平均df%>%pivot\u longerstarts\u with Actor%>%SummarySeavg=meangross