很难找出在标题中用这种方式表达的最佳方法,但是更广泛的问题是,我试图将数据集中的两个不重叠的列(按性别划分)合并为第三个与性别无关的列,每行/参与者的值...然后进行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)
仅在缺少值的列之间交织。
[可能只是将此视为重塑问题。在这里,我们使用dplyr
和tidyr
简化操作
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)