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

时间:2020-01-17 20:35:13

标签: r loops grepl

在标题中找出最好的表达方式的麻烦,但是这里更广泛的问题是我试图将数据集中的两个不重叠的列(按性别划分)合并到第三个不影响性别的列中并为每行/参与者设置值...然后进行 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 是与上面的字符串(即,以HTM或HTW开头的 k 列; HTM和HTW始终具有相同的 k 值)。在此示例中, k = 5,但是我将针对涉及不同 k 。

我尝试使用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

只需在缺少值的列之间进行交织。

1 个答案:

答案 0 :(得分: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)