Как выполнить итерацию по нескольким экземплярам на основе количества частичных совпадений строк? - PullRequest
0 голосов
/ 17 января 2020

Были проблемы с поиском лучшего способа выразить это в заголовке, но более широкая проблема заключается в том, что я пытаюсь объединить два непересекающихся столбца (разделенных по полу) в наборе данных в третий, нейтральный с гендерной точки зрения столбец со значениями для каждой строки / участника ... и затем сделайте это для 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, но я собираюсь сделать это с несколькими случаями (т. Е. С другими строками, которые должны совпадать вместо HTM / HTW), включая различные значения 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 голосов
/ 18 января 2020

По возможности это просто рассматривать это как проблему изменения формы. Здесь мы используем 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)
...