首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何计算列中的值并将它们与特定行匹配?

如何计算列中的值并将它们与特定行匹配?
EN

Stack Overflow用户
提问于 2021-03-31 23:54:18
回答 2查看 99关注 0票数 1

我有这样的数据集,其中ID和电子邮件对应于一个唯一的人。其余列表示按该人员/行命名的人员。例如,一个ID为1、电子邮件地址为alex@gmail.com的人在被问到问题时名为皮特、简和蒂姆。

代码语言:javascript
复制
id email          john_b alex_a pete jane tim
1  alex@gmail.com NA     NA     1    1    1
2  pete@yahoo.com NA     1      1    NA   NA
3  jane@q.com     NA     NA     1    NA   1
4  bea@mail.co    NA     1      1    NA   NA
5  tim@q.com      NA     NA     1    NA   1

我需要新的数据集看起来像这样,其中一个新的列提名表示该人/行在数据集的其余部分中被命名的次数。例如,Pete由5个人命名,并在具有相关电子邮件地址的行上的提名栏中获得5分。简被命名了一次(由alex@gmail.com),并且在提名列中获得了1,在与简的电子邮件地址所在的那一行上。

代码语言:javascript
复制
id email          john_b alex_a pete jane tim nomination
1  alex@gmail.com NA     NA     1    1    1   0 
2  pete@yahoo.com NA     1      1    NA   NA  5
3  jane@q.com     NA     NA     1    NA   1   1
4  bea@mail.co    NA     1      1    NA   NA  0
5  tim@q.com      NA     NA     1    NA   1   3

我有一种感觉,在这里我需要case-when和grepl的组合,但我不能理解它。

谢谢你的帮助!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-04-01 04:56:02

嗨,我终于想出了一个代码,我希望能让你达到你所期望的。然而,我想不出任何方法来匹配bea@mail.cojohn_b。它需要一个比我聪明得多的头脑,但如果我能想到任何东西,我会在这里更新我的代码:

代码语言:javascript
复制
library(dplyr)
library(tidyr)
library(stringr)

df <- tribble(
 ~email,          ~john_b, ~alex_a, ~pete, ~jane, ~tim,
  "alex@gmail.com", NA,     NA,     1,    1,    1,
  "pete@yahoo.com", NA ,    1,      1,    NA,   NA,
  "jane@q.com",     NA  ,   NA,     1,    NA,   1,
  "bea@mail.co",    NA,     1,      1,    NA,   NA,
  "tim@q.com",      NA ,    NA,     1,    NA,   1
)

# First we count the number of times each person is named
nm <- df %>%
  summarise(across(john_b:tim, ~ sum(.x, na.rm = TRUE))) %>%
  pivot_longer(everything(), names_to = "names", values_to = "nominations")
nm

# A tibble: 5 x 2
  names  nominations
  <chr>        <dbl>
1 john_b           0
2 alex_a           2
3 pete             5
4 jane             1
5 tim              3

然后,我们尝试将每个姓名与其对应的电子邮件进行部分匹配。这里唯一的问题就是我之前提到的john_b

代码语言:javascript
复制
nm2 <- nm %>%
  rowwise() %>%
  mutate(emails = map(names, ~ df$email[str_detect(df$email, str_sub(.x, 1L, 4L))])) %>%
  unnest(cols = c(emails))

nm2

# A tibble: 4 x 3
  names  nominations emails        
  <chr>        <dbl> <chr>         
1 alex_a           2 alex@gmail.com
2 pete             5 pete@yahoo.com
3 jane             1 jane@q.com    
4 tim              3 tim@q.com  

最后通过emails将这两个数据帧连接起来

代码语言:javascript
复制
df %>%
  full_join(nm2, by = c("email" = "emails"))

# A tibble: 5 x 8
  email          john_b alex_a  pete  jane   tim names  nominations
  <chr>          <lgl>   <dbl> <dbl> <dbl> <dbl> <chr>        <dbl>
1 alex@gmail.com NA         NA     1     1     1 alex_a           2
2 pete@yahoo.com NA          1     1    NA    NA pete             5
3 jane@q.com     NA         NA     1    NA     1 jane             1
4 bea@mail.co    NA          1     1    NA    NA NA              NA
5 tim@q.com      NA         NA     1    NA     1 tim              3

如果愿意,也可以省略列names。我只是把它们放在一起,这样你就可以把它们比较一下了。如果你能对约翰的电子邮件做一些修改,他们就完全匹配了。

票数 2
EN

Stack Overflow用户

发布于 2021-04-01 00:36:28

如果您以与电子邮件列相同的顺序组织您的姓名列,那么您可以简单地:

代码语言:javascript
复制
nomination <- colSums(df[, -(1:2)], na.rm = TRUE)
names(nomination) <- NULL
df <- cbind(df, nomination)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66891164

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档