根据其他因素的水平将一列的值分配给另一列:R
Assign values from one column to another based on levels of other factor: R
我想:
- 按因素分组(站点、位置);
- 如果因子 'Pos' == "A",将所选值 ("a") 分配给新列 ('Treat1') 中的相同行;
- 如果因子 'Pos' == "B",将所选值 ("b") 分配给新列 ('Treat1') 中的相同行;
- 如果因子 '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寻找:
- 网站排名1
- 低 A
- 低 B b
- 高阿阿
- 高 AT
- 高 AT b
- 高乙b
这个答案很酷,前 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"))
我想:
- 按因素分组(站点、位置);
- 如果因子 'Pos' == "A",将所选值 ("a") 分配给新列 ('Treat1') 中的相同行;
- 如果因子 'Pos' == "B",将所选值 ("b") 分配给新列 ('Treat1') 中的相同行;
- 如果因子 '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寻找:
- 网站排名1
- 低 A
- 低 B b
- 高阿阿
- 高 AT
- 高 AT b
- 高乙b
这个答案很酷,前 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"))