【问题标题】:Assign values from one column to another based on levels of other factor: R根据其他因素的水平将一列的值分配给另一列:R
【发布时间】:2020-05-19 04:04:30
【问题描述】:

我想:

  1. 按因素分组(站点、位置);
  2. 如果因子 'Pos' == "A",则将所选值 ("a") 分配给新列 ('Treat1') 中的相同行;
  3. 如果因子 'Pos' == "B",则将所选值 ("b") 分配给新列 ('Treat1') 中的相同行;
  4. 如果因子 'Pos' == "AT",则为新列 ('Treat 1') 的每个第一行分配一个值 ("a"),其中 'Pos' == A,第二个值 ("b" ) 到同一行的每隔一行。

到目前为止,我只知道如何编写前 3 个点,但这个循环仍然没有按我的预期执行。它仅填充新列 Treat1 中的最后一行。 有什么想法吗?

对解决此问题的不同方法持开放态度,但请记住,我是 R 初学者。

复制:

yow <- c(1:6) 
Pos <- c("A", "B", "A", "AT", "AT", "B")
df <- as.data.frame(Pos, yow)
df$Site <-  c("low", "low", "high", "high", "high", "high")

df$Treat1 <- NA

for (i in nrow(df %>% group_by(Site)){  
  if(df$Pos[i] == "A"){
    df$Treat1[i] <- "a"
  }
  else {
    if(df$Pos[i] == "B"){
      df$Treat1[i] <- "b"
    }
  }
}

我期待/正在寻找:

  • 网站位置1
  • 低A a
  • 低 B b
  • 高A a
  • AT a 高
  • 高 AT b
  • 高 B b

这个答案很酷,并且执行了我的 ifelse 循环失败的前 3 个步骤,但它并没有说明第 4 个问题! R Create new column of values based on the factor levels of another column

【问题讨论】:

    标签: r loops if-statement dplyr levels


    【解决方案1】:

    您可以在dplyr 中使用case_when

    library(dplyr)
    
    df %>%
      group_by(Pos) %>%
      mutate(Treat1 = case_when(Pos %in% c('A', 'B') ~ tolower(Pos), 
                                 Pos == 'AT' ~ c('a', 'b')))
    
    
    #  Pos     yow Site  Treat1
    #  <chr> <int> <chr> <chr> 
    #1 A         1 low   a     
    #2 B         2 low   b     
    #3 A         3 high  a     
    #4 AT        4 high  a     
    #5 AT        5 high  b     
    #6 B         6 high  b     
    

    【讨论】:

    • 嘿,这是一个绝妙的答案!谢谢!
    • 奇迹般的(我一直在解决这个问题的时间比我愿意承认的要长),今天下午我得到了另一个解决方案——终于!不像你的那样整洁@Ronak:df$Treat1 &lt;- NA df &lt;- df %&gt;% mutate(Treat1 = case_when( Pos %in% c("A") ~ "a", Pos %in% c("B") ~ "b", ))
    • 然后:df[df$Pos == "AT", ] &lt;- df[df$Pos == "AT", ] %&gt;% group_by(Site, Pos) %&gt;% mutate(Treat1 = ifelse((row_number() %% 2) == 1, "a", "b"))
    • 您可以将其添加为答案。
    【解决方案2】:

    另一种解决方案。不像你的罗纳克那么整洁:

    df$Treat1 <- NA
    df <- df %>% mutate(Treat1 = case_when(
      Pos %in% c("A") ~ "a", 
      Pos %in% c("B") ~ "b",
      ))     
    

    然后:

    df[df$Pos == "AT", ] <- df[df$Pos == "AT", ] %>% group_by(Site,Pos)%>% 
    mutate(Treat1 = ifelse((row_number() %% 2) == 1, "a", "b"))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-02-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-12
      • 1970-01-01
      • 2016-04-15
      • 2016-02-01
      相关资源
      最近更新 更多