Select 行按多个条件和列
Select rows by multiple conditions and columns
我有不同组的大型数据框:
df <- data.frame(
Week=c("Week1", "Week1","Week1","Week1","Week1","Week1","Week1","Week1","Week1","Week1","Week1","Week1"),
Day = c("Monday", "Monday", "Monday", "Tuesday", "Tuesday", "Tuesday", "Wednesday", "Wednesday",
"Wednesday", "Thursday", "Thursday", "Thursday"),
Type=c("A", "B", "C", "A", "B", "C", "A", "B", "C","A", "B", "C" ),
Result=c("YES", "YES", "NO", "NO", "NO", "NO", "YES", "NO", "NO","YES", "YES", "NO")
df
我想添加另一列,指示工作日的 "YES" 类型 "A" 和 "B" 的结果为 "YES",就像这样:
df2 <- data.frame(
Week=c("Week1", "Week1","Week1","Week1","Week1","Week1","Week1","Week1","Week1","Week1","Week1","Week1"),
Day = c("Monday", "Monday", "Monday", "Tuesday", "Tuesday", "Tuesday", "Wednesday", "Wednesday",
"Wednesday", "Thursday", "Thursday", "Thursday"),
Type=c("A", "B", "C", "A", "B", "C", "A", "B", "C","A", "B", "C" ),
Result=c("YES", "YES", "NO", "NO", "NO", "NO", "YES", "NO", "NO","YES", "YES", "NO"),
Result.AB=c("YES", "YES", "YES", "NO", "NO", "NO", "NO", "NO", "NO","YES", "YES", "YES")
)
df2
有人可以帮我吗?谢谢=)
这是一个使用 tidyverse 的解决方案。
library(tidyverse)
df <- data.frame(
Week=c("Week1", "Week1","Week1","Week1","Week1","Week1","Week1","Week1","Week1","Week1","Week1","Week1"),
Day = c("Monday", "Monday", "Monday", "Tuesday", "Tuesday", "Tuesday", "Wednesday", "Wednesday",
"Wednesday", "Thursday", "Thursday", "Thursday"),
Type=c("A", "B", "C", "A", "B", "C", "A", "B", "C","A", "B", "C" ),
Result=c("YES", "YES", "NO", "NO", "NO", "NO", "YES", "NO", "NO","YES", "YES", "NO")
)
df2 <- df %>%
mutate(Day = factor(Day, levels = c('Monday', 'Tuesday', 'Wednesday', 'Thursday'))) %>%
spread(key = Type, value = Result) %>%
mutate(Result.AB = ifelse(A == 'YES' & B == 'YES', 'YES', 'NO')) %>%
gather(key = Type, value = Result, -c(Week, Day, Result.AB)) %>%
arrange(Day, Type) %>%
select(Week, Day, Type, Result, Result.AB)
df2
#> Week Day Type Result Result.AB
#> 1 Week1 Monday A YES YES
#> 2 Week1 Monday B YES YES
#> 3 Week1 Monday C NO YES
#> 4 Week1 Tuesday A NO NO
#> 5 Week1 Tuesday B NO NO
#> 6 Week1 Tuesday C NO NO
#> 7 Week1 Wednesday A YES NO
#> 8 Week1 Wednesday B NO NO
#> 9 Week1 Wednesday C NO NO
#> 10 Week1 Thursday A YES YES
#> 11 Week1 Thursday B YES YES
#> 12 Week1 Thursday C NO YES
我已经使用 spread
to get one row per day, mutate
to compute the new Result.AB
variable then gather
再次拆分观察结果。管道的其余部分使行按正确的顺序排列。
我有不同组的大型数据框:
df <- data.frame(
Week=c("Week1", "Week1","Week1","Week1","Week1","Week1","Week1","Week1","Week1","Week1","Week1","Week1"),
Day = c("Monday", "Monday", "Monday", "Tuesday", "Tuesday", "Tuesday", "Wednesday", "Wednesday",
"Wednesday", "Thursday", "Thursday", "Thursday"),
Type=c("A", "B", "C", "A", "B", "C", "A", "B", "C","A", "B", "C" ),
Result=c("YES", "YES", "NO", "NO", "NO", "NO", "YES", "NO", "NO","YES", "YES", "NO")
df
我想添加另一列,指示工作日的 "YES" 类型 "A" 和 "B" 的结果为 "YES",就像这样:
df2 <- data.frame(
Week=c("Week1", "Week1","Week1","Week1","Week1","Week1","Week1","Week1","Week1","Week1","Week1","Week1"),
Day = c("Monday", "Monday", "Monday", "Tuesday", "Tuesday", "Tuesday", "Wednesday", "Wednesday",
"Wednesday", "Thursday", "Thursday", "Thursday"),
Type=c("A", "B", "C", "A", "B", "C", "A", "B", "C","A", "B", "C" ),
Result=c("YES", "YES", "NO", "NO", "NO", "NO", "YES", "NO", "NO","YES", "YES", "NO"),
Result.AB=c("YES", "YES", "YES", "NO", "NO", "NO", "NO", "NO", "NO","YES", "YES", "YES")
)
df2 有人可以帮我吗?谢谢=)
这是一个使用 tidyverse 的解决方案。
library(tidyverse)
df <- data.frame(
Week=c("Week1", "Week1","Week1","Week1","Week1","Week1","Week1","Week1","Week1","Week1","Week1","Week1"),
Day = c("Monday", "Monday", "Monday", "Tuesday", "Tuesday", "Tuesday", "Wednesday", "Wednesday",
"Wednesday", "Thursday", "Thursday", "Thursday"),
Type=c("A", "B", "C", "A", "B", "C", "A", "B", "C","A", "B", "C" ),
Result=c("YES", "YES", "NO", "NO", "NO", "NO", "YES", "NO", "NO","YES", "YES", "NO")
)
df2 <- df %>%
mutate(Day = factor(Day, levels = c('Monday', 'Tuesday', 'Wednesday', 'Thursday'))) %>%
spread(key = Type, value = Result) %>%
mutate(Result.AB = ifelse(A == 'YES' & B == 'YES', 'YES', 'NO')) %>%
gather(key = Type, value = Result, -c(Week, Day, Result.AB)) %>%
arrange(Day, Type) %>%
select(Week, Day, Type, Result, Result.AB)
df2
#> Week Day Type Result Result.AB
#> 1 Week1 Monday A YES YES
#> 2 Week1 Monday B YES YES
#> 3 Week1 Monday C NO YES
#> 4 Week1 Tuesday A NO NO
#> 5 Week1 Tuesday B NO NO
#> 6 Week1 Tuesday C NO NO
#> 7 Week1 Wednesday A YES NO
#> 8 Week1 Wednesday B NO NO
#> 9 Week1 Wednesday C NO NO
#> 10 Week1 Thursday A YES YES
#> 11 Week1 Thursday B YES YES
#> 12 Week1 Thursday C NO YES
我已经使用 spread
to get one row per day, mutate
to compute the new Result.AB
variable then gather
再次拆分观察结果。管道的其余部分使行按正确的顺序排列。