如何合并两个大data.frame,并选择其中一部分值?

时间:2019-07-08 12:00:42

标签: r function dataframe merge mean

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

这样想吧;我有两条长绳,一根长10m,另一根长12m。一个字符串是红色,另一字符串是蓝色。两根弦在整个弦上的间隔均为0.05厘米。每10节,我给每个单独的结点ID-1代表红色,ID1-1代表蓝色,依此类推。但是,我手上都有每根弦。我希望这两个字符串成为一个长字符串,并排合并。因此,我将字符串的顶部和末端绑在一起。现在,如果我想要一个单独的结,即ID-1的长度为ID-1字符串的1/10,则解开第一个结,依此类推。 –我想要一个函数,该函数可以让我查找从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 :(得分:0)

以下功能可能会有所帮助:

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

该函数的逻辑是,当R提供超出范围的索引时,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
}