Как объединить два больших data.frames и взять выбранную часть этих значений? - PullRequest
0 голосов
/ 08 июля 2019
specdata <- list.files(getwd(), pattern="*.csv")
directory <- lapply(specdata, read.csv)
directory_final <- do.call(rbind, directory)
library(tidyverse)
one <- select(directory_final, nitrate, ID)
two <- no.omit(one)
a <- select(directory_final, sulfate, ID)
b <- na.omit(a)
two_df <- mutate(two, id = rownames(two))
b_df <- mutate(b, id = rownames(b))
library(plyr)
alpha <- join(two_df, b_df, by = "id", match = "all")
alpha$id <- NULL

dput(head(alpha, 5))
structure(list(sulfate = c(7.21, 5.99, 4.68, 3.47, 2.42), ID = c(1L, 
1L, 1L, 1L, 1L), nitrate = c(0.651, 0.428, 1.04, 0.363, 0.507
), ID = c(1L, 1L, 1L, 1L, 1L)), row.names = c(NA, 5L), class = "data.frame")

dim(alpha)
118783 4

Думайте об этом так;У меня есть две длинные струны, одна из которых простирается на 10 метров, а другая на 12 метров.Одна строка красная, а другая синяя.обе струны имеют сучки с интервалами 0,05 см по всей струне.Каждые 10 узлов я даю каждому отдельному узлу ID-1 для красного и ID1-1 для синего и так далее.У меня есть каждая строка на каждой руке, однако;Я хочу, чтобы эти две строки были одной длинной строкой, слитой бок о бок.Поэтому я связываю верх и конец нити.Теперь, если я хочу отдельный узел, от ID-1, 1/10 длины строки ID-1, я развязываю первый и так далее.- Мне нужна функция, которая позволяет мне находить среднее значение каждого развязываемого узла из ID-1 в диапазоне от 1: 332 или ID1-1 в диапазоне от 1: 332.

Мне нужно что-то вроде

alpha_function(nitrate, ID = 1:50)
alpha_function(sulfate, ID = 1:50)

Функция, которая может собирать все средние значения нитратов или сульфатов по ID

. Кроме того, когда я использую функцию 'join', я могу принимать только средние значения первых data.frame.(b_df), который я помещаю в эту функцию.тогда как вторая всегда возвращает NA.

mean(alpha$sulfate)
3.189369

mean(alpha$nitrate)
NA

Я также хотел бы знать, почему это происходит и как это можно исправить, чтобы можно было принять оба итоговых значения?

1 Ответ

0 голосов
/ 08 июля 2019

Может помочь следующая функция:

combine.df <- function(df1,df2){
  n <- max(nrow(df1),nrow(df2))
  cbind(df1[1:n,],df2[1:n,])
}

Логика функции заключается в том, что R автоматически вставляет NA, когда вы задаете ей индексы, выходящие за пределы диапазона.

В случае, если у фреймов данных различное количество строк, лишние строки будут иметь имена, подобные NA, NA.1, NA.2, .... Если вам это не нравится, вы можете использовать следующую версию этой функции:

combine.df <- function(df1,df2){
  n <- max(nrow(df1),nrow(df2))
  df <- cbind(df1[1:n,],df2[1:n,])
  row.names(df) <- 1:n
  df
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...