R 如何构建字符串变量以捕获多个cols信息
我有一个df,看起来像这样: 可以使用以下代码进行构建:R 如何构建字符串变量以捕获多个cols信息,r,R,我有一个df,看起来像这样: 可以使用以下代码进行构建: structure(list(ID = c(1, 2, 3, 4, 5), Pass = c(0, 1, 1, 1, 1), Math = c(0, 0, 1, 1, 1), ELA = c(0, 1, 0, 1, 0), PE = c(0, 0, 1, 1, 1)), row.names = c(NA, -5L), class = c("tbl_df", "tbl", &q
structure(list(ID = c(1, 2, 3, 4, 5), Pass = c(0, 1, 1, 1, 1),
Math = c(0, 0, 1, 1, 1), ELA = c(0, 1, 0, 1, 0), PE = c(0,
0, 1, 1, 1)), row.names = c(NA, -5L), class = c("tbl_df",
"tbl", "data.frame"))
其中pass
表示学生是否通过任何测试。现在我想构建一个新的varResult
来捕获学生的测试结果,如下所示,我应该怎么做
这里有一个解决方案:
library(dplyr)
library(magrittr)
library(stringr)
df <- structure(list(ID = c(1, 2, 3, 4, 5), Pass = c(0, 1, 1, 1, 1),
Math = c(0, 0, 1, 1, 1), ELA = c(0, 1, 0, 1, 0), PE = c(0,
0, 1, 1, 1)), row.names = c(NA, -5L), class = c("tbl_df",
"tbl", "data.frame"))
df %<>% pivot_longer(cols = -c(ID, Pass), names_to = "sub", values_to = "done")
df %<>% group_by(ID) %>% mutate(Result = paste0(ifelse(done == 1, sub, NA), collapse = ", ")) %>% ungroup()
df %<>% pivot_wider(names_from = sub, values_from = done)
df %<>% mutate(Result = paste0("Pass: ", str_replace_all(Result, "NA[, ]*", "")))
df %<>% mutate(Result = ifelse(str_detect(Result, "Pass: $"), "Not pass", str_replace_all(Result, ",[\\s]*$", "")))
df
# # A tibble: 5 x 6
# ID Pass Result Math ELA PE
# <dbl> <dbl> <chr> <dbl> <dbl> <dbl>
# 1 1 0 Not pass 0 0 0
# 2 2 1 Pass: ELA 0 1 0
# 3 3 1 Pass: Math, PE 1 0 1
# 4 4 1 Pass: Math, ELA, PE 1 1 1
# 5 5 1 Pass: Math, PE 1 0 1
库(dplyr)
图书馆(magrittr)
图书馆(stringr)
df%mutate(Result=paste0(ifelse(done==1,sub,NA),collapse=“,”)%%>%ungroup()
df%%pivot\u加宽(名称\u from=sub,值\u from=done)
df%%突变(结果=粘贴0(“通过:”,str_替换_全部(结果,“NA[,]*”,”))
df%%mutate(Result=ifelse(str_detect(Result,“Pass:$”),“Not Pass”,str_replace_all(Result,”,[\\s]*$,“))
df
##tibble:5 x 6
#我通过了数学考试
#
#1 1 0未通过0 0 0
#2 2 1通过:ELA 0 1 0
#3 3 1通过:数学、体育1 0 1
#通过:数学、ELA、PE 1
#5 5 1及格:数学、体育1 0 1
如有必要,我可以解释代码的作用。这里有一个解决方案:
library(dplyr)
library(magrittr)
library(stringr)
df <- structure(list(ID = c(1, 2, 3, 4, 5), Pass = c(0, 1, 1, 1, 1),
Math = c(0, 0, 1, 1, 1), ELA = c(0, 1, 0, 1, 0), PE = c(0,
0, 1, 1, 1)), row.names = c(NA, -5L), class = c("tbl_df",
"tbl", "data.frame"))
df %<>% pivot_longer(cols = -c(ID, Pass), names_to = "sub", values_to = "done")
df %<>% group_by(ID) %>% mutate(Result = paste0(ifelse(done == 1, sub, NA), collapse = ", ")) %>% ungroup()
df %<>% pivot_wider(names_from = sub, values_from = done)
df %<>% mutate(Result = paste0("Pass: ", str_replace_all(Result, "NA[, ]*", "")))
df %<>% mutate(Result = ifelse(str_detect(Result, "Pass: $"), "Not pass", str_replace_all(Result, ",[\\s]*$", "")))
df
# # A tibble: 5 x 6
# ID Pass Result Math ELA PE
# <dbl> <dbl> <chr> <dbl> <dbl> <dbl>
# 1 1 0 Not pass 0 0 0
# 2 2 1 Pass: ELA 0 1 0
# 3 3 1 Pass: Math, PE 1 0 1
# 4 4 1 Pass: Math, ELA, PE 1 1 1
# 5 5 1 Pass: Math, PE 1 0 1
库(dplyr)
图书馆(magrittr)
图书馆(stringr)
df%mutate(Result=paste0(ifelse(done==1,sub,NA),collapse=“,”)%%>%ungroup()
df%%pivot\u加宽(名称\u from=sub,值\u from=done)
df%%突变(结果=粘贴0(“通过:”,str_替换_全部(结果,“NA[,]*”,”))
df%%mutate(Result=ifelse(str_detect(Result,“Pass:$”),“Not Pass”,str_replace_all(Result,”,[\\s]*$,“))
df
##tibble:5 x 6
#我通过了数学考试
#
#1 1 0未通过0 0 0
#2 2 1通过:ELA 0 1 0
#3 3 1通过:数学、体育1 0 1
#通过:数学、ELA、PE 1
#5 5 1及格:数学、体育1 0 1
如有必要,我可以解释代码的作用。尝试下面的基本R代码
q <- with(data.frame(which(df[-(1:2)] == 1, arr.ind = TRUE)),
tapply(names(df[-(1:2)])[col], factor(row, levels = 1:nrow(df)), toString))
df$Result <- ifelse(is.na(q), "Not Pass", paste0("Pass: ", q))
q尝试下面的基本R代码
q <- with(data.frame(which(df[-(1:2)] == 1, arr.ind = TRUE)),
tapply(names(df[-(1:2)])[col], factor(row, levels = 1:nrow(df)), toString))
df$Result <- ifelse(is.na(q), "Not Pass", paste0("Pass: ", q))
q使用dplyr
和rowwise
library(dplyr)
library(stringr)
df1 %>%
rowwise %>%
mutate(Result = if(as.logical(Pass))
str_c('Pass: ', toString(names(select(., Math:PE))[as.logical(c_across(Math:PE))])) else 'Not pass' ) %>%
ungroup
# A tibble: 5 x 6
# ID Pass Math ELA PE Result
# <dbl> <dbl> <dbl> <dbl> <dbl> <chr>
#1 1 0 0 0 0 Not pass
#2 2 1 0 1 0 Pass: ELA
#3 3 1 1 0 1 Pass: Math, PE
#4 4 1 1 1 1 Pass: Math, ELA, PE
#5 5 1 1 0 1 Pass: Math, PE
库(dplyr)
图书馆(stringr)
df1%>%
行%>%
变异(结果=if(如逻辑(通过))
str_c('Pass:',toString(名称(select(,Math:PE))[as.logical(c_-overs(Math:PE))])其他'Not Pass')%>%
解组
#一个tibble:5x6
#我通过了数学考试
#
#1 100 0 0 0 0未通过
#2 2 1 0 1 0通过:ELA
#3 3 1 0 1通过:数学、体育
#4通过:数学、ELA、体育
#5 5 1 0 1通过:数学、体育
数据
df1使用dplyr
和rowwise
library(dplyr)
library(stringr)
df1 %>%
rowwise %>%
mutate(Result = if(as.logical(Pass))
str_c('Pass: ', toString(names(select(., Math:PE))[as.logical(c_across(Math:PE))])) else 'Not pass' ) %>%
ungroup
# A tibble: 5 x 6
# ID Pass Math ELA PE Result
# <dbl> <dbl> <dbl> <dbl> <dbl> <chr>
#1 1 0 0 0 0 Not pass
#2 2 1 0 1 0 Pass: ELA
#3 3 1 1 0 1 Pass: Math, PE
#4 4 1 1 1 1 Pass: Math, ELA, PE
#5 5 1 1 0 1 Pass: Math, PE
库(dplyr)
图书馆(stringr)
df1%>%
行%>%
变异(结果=if(如逻辑(通过))
str_c('Pass:',toString(名称(select(,Math:PE))[as.logical(c_-overs(Math:PE))])其他'Not Pass')%>%
解组
#一个tibble:5x6
#我通过了数学考试
#
#1 100 0 0 0 0未通过
#2 2 1 0 1 0通过:ELA
#3 3 1 0 1通过:数学、体育
#4通过:数学、ELA、体育
#5 5 1 0 1通过:数学、体育
数据
df1这太好了!!虽然行
和列
来自哪里?@Dunois来自哪个
选项arr.ind=TRUE
这太好了!!虽然行
和列
来自哪里?@Dunois来自哪个
,选项为arr.ind=TRUE