在标题中找出最好的表达方式的麻烦,但是这里更广泛的问题是我试图将数据集中的两个不重叠的列(按性别划分)合并到第三个不影响性别的列中并为每行/参与者设置值...然后进行 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)
只需在缺少值的列之间进行交织。
答案 0 :(得分:0)
可能只是将此视为重塑问题。在这里,我们使用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)