根据其他因素的水平将一列的值分配给另一列:R

Assign values from one column to another based on levels of other factor: R

我想:

  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"
    }
  }
}

我expect/am寻找:

这个答案很酷,前 3 个步骤我的 ifelse 循环失败了,但它没有说明第 4 个问题!

您可以在 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 <- 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"))