Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/80.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 如何根据字符串模式将数据帧的所有列拆分为不同的组,并将函数应用于每组列?_R_Dplyr_Tidyverse_Apply - Fatal编程技术网

R 如何根据字符串模式将数据帧的所有列拆分为不同的组,并将函数应用于每组列?

R 如何根据字符串模式将数据帧的所有列拆分为不同的组,并将函数应用于每组列?,r,dplyr,tidyverse,apply,R,Dplyr,Tidyverse,Apply,我想创建类似于b_none、c_none等列。在发布这个问题时,我有了一个循环的想法,并得到了答案。我还要补充一点 library(glue) library(tidyverse) data = crossing(id = c(1:4),q = letters[1:5], nums = c(1:10)) set.seed(25) data$val = sample(c(NA,"foo", "bar"), nrow(data), prob = c(0.95

我想创建类似于b_none、c_none等列。在发布这个问题时,我有了一个循环的想法,并得到了答案。我还要补充一点

library(glue)
library(tidyverse)

data = crossing(id = c(1:4),q = letters[1:5], nums = c(1:10))
set.seed(25)
data$val = sample(c(NA,"foo", "bar"), nrow(data), prob = c(0.95,0.02,0.03), replace = T)
data = data %>% mutate(q = glue("{q}{nums}")) %>% 
  select(-nums) %>% 
  pivot_wider(id_cols = id, names_from = q, values_from = val)

#Output Im looking for
data %>% 
  select(id,starts_with("a")) %>% 
  mutate(
    a_none = apply(.[,grep("a", names(.))],  1, function(x) all(is.na(x)))
  )
这个for循环为我完成了任务。还有更好的主意吗


我尝试使用
dput()
插入输出,但失败。

您可以使用
split。默认值
根据相似的命名列拆分数据帧,并使用
imap
from
purr
获取每个组的逻辑值

for (pattern in letters[1:5]) {
  varname = glue("{pattern}_none")
  data[[varname]] = apply(data[,grep(pattern, names(data))],  1, function(x) all(is.na(x)))
}
library(dplyr)
library(purrr)

result <- split.default(data[-1], sub('\\d+', '', names(data)[-1])) %>%
  imap_dfc(~.x %>% transmute(!!paste0(.y, '_none') := rowSums(!is.na(.)) == 0))
result

#  a_none b_none c_none d_none e_none
#  <lgl>  <lgl>  <lgl>  <lgl>  <lgl> 
#1 FALSE  FALSE  TRUE   TRUE   FALSE 
#2 TRUE   TRUE   TRUE   TRUE   TRUE  
#3 FALSE  TRUE   TRUE   TRUE   FALSE 
#4 FALSE  TRUE   TRUE   FALSE  FALSE 
data <- bind_cols(data, result)
sapply(split.default(data[-1], sub('\\d+', '', names(data)[-1])), 
       function(x) rowSums(!is.na(x)) == 0)