Как объединить несколько переменных данных в одну переменную данных?
После создания моего фрейма данных и выбора переменных, на которые я хочу посмотреть, я сталкиваюсь с дилеммой. Лист 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...)