R 如何构建字符串变量以捕获多个cols信息

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

我有一个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"))
其中
pass
表示学生是否通过任何测试。现在我想构建一个新的var
Result
来捕获学生的测试结果,如下所示,我应该怎么做

这里有一个解决方案:

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