【问题标题】:Ifelse to Compare the content of columns with dplyrIfelse 用 dplyr 比较列的内容
【发布时间】:2021-09-23 03:25:04
【问题描述】:

我有一个 df,我想根据其他列的内容添加一列。 我让它适用于一个样本:

df <- df %>% 
  mutate(SB013 = if_else(sample_id == "SB013", IN, OUT))

我添加一个名为 SB013 的列,如果 sample_id 列中的行 == "SB013" 然后添加列 IN 的内容,否则添加列 OUT 的内容。 我现在需要扩展它以添加更多的列作为 sample_id 的数量。 所以:

   sample_names<- unique(df$sample_id)
   sample_names

[1] "SB013" "SB014" "SB015" "SB016"

我尝试了几个 for 循环:

for (name in sample_names) {
   comb.variant <- comb.variant %>% 
   mutate(name = if_else(sample_id == name, Alt,Ref))
  
}

其中只添加了一个名为“名称”的列。 并且:

for (i in 1:length(sample_names)) {
  #print(sample_names[i])
  comb.variant <- comb.variant %>%
    mutate(sample_names[i] = if_else(sample_id == sample_names[i], Alt,Ref))
}
Error: unexpected '=' in:
"  comb.variant <- comb.variant %>%
    mutate(sample_names[i] ="

我该如何进行这项工作??

【问题讨论】:

  • 为什么这个问题被标记了?请解释。我是新手,已经输入了我尝试过的所有代码???
  • 不是我的反对意见,但通常问题应包括 3 个基本内容。 1) 示例数据 2) 预期输出 3) 您尝试过的代码。你有 3) 但没有 1) 和 2)。阅读how to give a reproducible example

标签: r dplyr


【解决方案1】:

最好的方法是使用glue 包。这使您可以轻松地根据字符串分配变量名称:

library(tidyverse)
library(glue)

> df <- data.frame(
    sample_id = c('SB013', 'SB014', 'SB013', 'SB014', 'SB015', 'SB016', 'SB016'), 
    IN = c(1,2,3,4,5,6,7), 
    OUT = c(rep('out',7)))

> df
  sample_id IN OUT
1     SB013  1 out
2     SB014  2 out
3     SB013  3 out
4     SB014  4 out
5     SB015  5 out
6     SB016  6 out
7     SB016  7 out

> df %>% mutate(`SB013` = ifelse(sample_id == 'SB013', IN, OUT))

  sample_id IN OUT SB013
1     SB013  1 out     1
2     SB014  2 out   out
3     SB013  3 out     3
4     SB014  4 out   out
5     SB015  5 out   out
6     SB016  6 out   out
7     SB016  7 out   out

请注意,在这种情况下,dplyr 命令if_else 将不起作用,因为INOUT 属于不同类型。如果是大型数据集,我建议使用矢量化函数(maplapply),但如果只有 4 个唯一的 sample_id

> list_of_ids <- 
    df %>% 
    distinct(sample_id) %>%
    unlist() %>%
    unname()

> list_of_ids
[1] "SB013" "SB014" "SB015" "SB016"


> for(current_id in list_of_ids){
df <- 
    df %>% 
    mutate('{current_id}' := ifelse(sample_id == current_id, IN, OUT))
}

> df
  sample_id IN OUT SB013 SB014 SB015 SB016
1     SB013  1 out     1   out   out   out
2     SB014  2 out   out     2   out   out
3     SB013  3 out     3   out   out   out
4     SB014  4 out   out     4   out   out
5     SB015  5 out   out   out     5   out
6     SB016  6 out   out   out   out     6
7     SB016  7 out   out   out   out     7

以后,请在您的问题中添加示例数据和预期输出。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-17
    • 2011-04-15
    • 1970-01-01
    • 2021-08-31
    • 2012-01-22
    相关资源
    最近更新 更多