Как объединить несколько переменных данных в одну переменную данных?

После создания моего фрейма данных и выбора переменных, на которые я хочу посмотреть, я сталкиваюсь с дилеммой. Лист Excel, который служит моим источником данных, использовался разными людьми, записывающими данные одного типа.

Mock     Neg Neg1PCR Neg2PCR  NegPBS     red     Red RedWine   water   Water   white   White 
  1       9       1       1       1       2      18       4       4       4       2      26 

Как видите, поскольку данные записаны по-разному, основные группы (Redwine, Whitewine и Water) теперь разделены на подгруппы. Как мне объединить подгруппы в объединенную группу, например. красное + красное + красное вино -> Всего вина. Я использую пакет phyloseq для этого типа набора данных

3 ответа

Решение
names <- c("red","white","water")
df2 <- setNames(data.frame(matrix(ncol = length(names), nrow = nrow(df))),names)

for(col in names){
  df2[,col] <- rowSums(df[,grep(col,tolower(names(df)))])
}

Вот

grep(col,tolower(names(df)))

ищет все имена столбцов, которые содержат строки типа "красный" в именах вашего вектора. Затем вы просто суммируете их в новом data.frame df2 определены с хорошими длинами

Можно использовать dplyr:starts_with а также dplyr::select объединить столбцы. ignore.case по умолчанию TRUE в dplyr:starts_with с помощью в data.frame ОП опубликовал.

library(dplyr)
names <- c("red", "white", "water")
cbind(df[1], t(mapply(function(x)rowSums(select(df, starts_with(x))), names)))

#   Mock red white water
# 1    1  24    28     8

Данные:

df <- read.table(text = 
"Mock   Neg Neg1PCR Neg2PCR  NegPBS     red   Red  RedWine   water   Water   white   White 
1       9       1       1       1       2      18       4       4       4       2      26",
header = TRUE, stringsAsFactors = FALSE)

Я бы просто создал новый data.frame, проще всего сделать с dplyr, но выполнимо с базой R:

с dplyr

newFrame <- oldFrame %>% mutate(Mock = Mock, Neg = Neg + Neg1PCR + Neg2PCR + NegPBS, Red = red + Red + RedWine, Water = water + Water, White = white = White)

с основанием R (не завершено, но вы получите точку)

newFrame <- data.frame(Red = oldFrame$Red + oldFrame$red + oldFrame$RedWine...)

Другие вопросы по тегам