如何根据部分字符串匹配的数量在多个实例上迭代一个函数?

问题描述 投票:0回答:1

很难找出在标题中用这种方式表达的最佳方法,但是更广泛的问题是,我试图将数据集中的两个不重叠的列(按性别划分)合并为第三个与性别无关的列,每行/参与者的值...然后进行i次。

这里是一个例子。我的数据集是ELSH2,第一组列将是HTM1,HTW1和HT1。我很快就想出了如何只合并一次列:

ELSH2$HT1 <- ifelse(is.na(ELSH2$HTM1), ELSH2$HTW1, ELSH2$HTM1)

因此,现在将HTW1和HTM1列中的所有值合并到HT1列中。但本质上我想要的是:

ELSH2$HTi <- ifelse(is.na(ELSH2$HTMi), ELSH2$HTWi, ELSH2$HTMi)

其中i是范围1-k中的每个序号,k是与上述字符串匹配的列名末尾的最大数字(即,有k 以HTM或HTW开头的列; HTM和HTW始终具有相同的k值)。在此示例中,k = 5,但我将使用涉及不同k值的多种情况(即,要匹配HTM / HTW的其他字符串)进行此操作。

我尝试使用grepl

ELSH2[,grepl("HT.", names(ELSH2))] <- ifelse(
    is.na(ELSH[,grepl("HTM.", names(ELSH2))]), 
    ELSH2[,grepl("HTW.", names(ELSH2))], 
    ELSH2[,grepl("HTM.", names(ELSH2))])

但是我收到以下错误:

Warning message:
In `[<-.data.frame`(`*tmp*`, , grepl("HTM.", names(ELSH2)), value = list( :
  provided 5300 variables to replace 10 variables

我很确定我在这里制作HT列的方式有问题,但是即使我手动创建它们,也会遇到相同的错误。

编辑:这是一个示例数据集。

HTM1<- rnorm(10)
HTW1<- rnorm(10)
HTM2<- rnorm(10)
HTW2<- rnorm(10)
HTM3<- rnorm(10)
HTW3<- rnorm(10)
HTM4<- rnorm(10)
HTW4<- rnorm(10)
HTM5<- rnorm(10)
HTW5<- rnorm(10)

HTM <- data.frame(HTM1,HTM2,HTM3,HTM4,HTM5)
HTW <- data.frame(HTW1,HTW2,HTW3,HTW4,HTW5)
HTM[1, ] <- NA
HTM[3, ] <- NA
HTM[5, ] <- NA
HTM[7, ] <- NA
HTM[9, ] <- NA

HTW[2, ] <- NA
HTW[4, ] <- NA
HTW[6, ] <- NA
HTW[8, ] <- NA
HTW[10, ] <- NA

ELSH2 <- cbind(HTW, HTM)

ELSH2看起来像这样:Original

而且我希望最终的HT列看起来像这样的光影般的怪兽:Desired result

仅在缺少值的列之间交织。

r loops grepl
1个回答
0
投票

[可能只是将此视为重塑问题。在这里,我们使用dplyrtidyr简化操作

library(dplyr)
library(tidyr)
ELSH2 %>% 
  mutate(row=row_number()) %>% 
  pivot_longer(HTW1:HTM5) %>% 
  filter(!is.na(value)) %>% 
  extract(name, into=c("prefix","code"), "^([A-Za-z]+)(\\d+)$") %>% 
  mutate(name=paste0("HT", code)) %>% 
  pivot_wider(row, names_from=name, values_from=value)
© www.soinside.com 2019 - 2024. All rights reserved.