R 聚合数据时出错

R 聚合数据时出错,r,R,我正在研究一个大数据帧。 第一列包含字符串值,第二列包含数字数据。但是,在所描述的第二个块中,删除整行或整列时无法消除某些NA,因为甚至会删除重要数据 我想创建一个包含相同第一列的新矩阵,但我需要新的数值数据,计算为每行与包含所有数值总和的新行之间的比率;这就是我所做的: df1<- df[,-(1)] tot<- colSums(df1, na.rm = TRUE) ratio <- df1 / rep(tot, each = nrow(df1)) firstcol <

我正在研究一个大数据帧。 第一列包含字符串值,第二列包含数字数据。但是,在所描述的第二个块中,删除整行或整列时无法消除某些NA,因为甚至会删除重要数据 我想创建一个包含相同第一列的新矩阵,但我需要新的数值数据,计算为每行与包含所有数值总和的新行之间的比率;这就是我所做的:

df1<- df[,-(1)]
tot<- colSums(df1, na.rm = TRUE)
ratio <- df1 / rep(tot, each = nrow(df1))
firstcol <- df[1]
data <- cbind(firstcol ,ratio)
我尝试进行相同的聚合,但代码的这一部分除外:

ratio <- data / rep(tot, each = nrow(df1))

ratio如果不实际观察您运行R代码,就很难猜测发生了什么。由于您似乎并没有很好地管理变量名,所以很可能在实验过程中屏蔽了变量

我们浪费了很多时间猜测发生了什么事。我建议,我们尝试了一个健壮的代码版本。在下面,我将提供一个函数,将数据帧作为唯一的参数函数内的变量与函数外的变量不会冲突,即使它们具有相同的名称

foo <- function (df) {
  error.default <- getOption("error")
  options(error = utils::recover)
  n <- nrow(df)
  value_df <- df[, -1]  ## data frame with values
  tot <- colSums(value_df, na.rm = TRUE)  ## column sums
  if (any(is.na(tot))) stop("NA detected in column sums! Exit!")
  ratio <- value_df / rep(tot, each = n)  ## rescaling
  string_df <- df[1]
  if (nrow(string_df) != nrow(ratio)) stop("dimension dismatch!!")
  cat("\n")
  data <- cbind(string_df ,ratio)
  cat("data summary:\n")
  cat(paste("number of rows: ", n, "\n",sep = ""))
  cat(paste("number of columns: ", ncol(data), "\n",sep = ""))
  ## NA summary: critical because aggregate will drop NA rows
  ## when all rows are dropped, aggregate complains "no row to aggregate"
  data <- na.omit(data)
  cat(paste("The number of non-NA rows passed to aggregate:", nrow(data))); cat("\n")
  cat("\n")
  if (nrow(data) == 0) stop("All rows are dropped! Exit!!")
  formula <- as.formula(paste(". ~", colnames(df)[1]))
  cat("the formula is: ")
  print(formula); cat("\n")
  agg <- aggregate(formula, data, FUN = sum)
  cat("aggregation success!!\n\n")
  options(error = error.default)
  return(agg)
  }

agg <- foo(df)

这应该行。

@ZheyuanLi,我创建了一个新问题。@ZheyuanLi在上一个示例中firstColName是VAL1,但在这种情况下,一切都起作用了。仅仅使用我的真实df,这是一个大数据,它不起作用。我的意思是,聚合之前的输出是正确的,但是聚合给了我这个mistake@ZheyuanLi,我尝试了,但它给了我同样的错误,奇怪的是,如果我在
数据
中添加一个新行,它的结构与以前的所有行相同,它会进行聚合,但是生成的数据帧只包含新的row@ZheyuanLi,好的,谢谢现在错误是:`model.frame.default(formula=cbind(colname,:变量长度不同(为'VAL1'找到))`,我的文件中有一些NA值(从第2列开始),但我无法删除整行或整列,因为在下面的单元格中有相关数据。我认为NA作为NA保留了下来,但没有给我这些问题。简单地说,由于存在NA,因此无法使用rep()我错了,因为在第六行你写道:tot有没有一种方法可以让我按名称将它们分组,并对数值求和?我同意,因为数据的维度是最合理的
ratio <- data / rep(tot, each = nrow(df1))
df1<- df[,-(1)]    
firstcol <- df[1]
data <- cbind(firstcol ,df1)
agg<- aggregate(. ~ firstColName, data, sum)
foo <- function (df) {
  error.default <- getOption("error")
  options(error = utils::recover)
  n <- nrow(df)
  value_df <- df[, -1]  ## data frame with values
  tot <- colSums(value_df, na.rm = TRUE)  ## column sums
  if (any(is.na(tot))) stop("NA detected in column sums! Exit!")
  ratio <- value_df / rep(tot, each = n)  ## rescaling
  string_df <- df[1]
  if (nrow(string_df) != nrow(ratio)) stop("dimension dismatch!!")
  cat("\n")
  data <- cbind(string_df ,ratio)
  cat("data summary:\n")
  cat(paste("number of rows: ", n, "\n",sep = ""))
  cat(paste("number of columns: ", ncol(data), "\n",sep = ""))
  ## NA summary: critical because aggregate will drop NA rows
  ## when all rows are dropped, aggregate complains "no row to aggregate"
  data <- na.omit(data)
  cat(paste("The number of non-NA rows passed to aggregate:", nrow(data))); cat("\n")
  cat("\n")
  if (nrow(data) == 0) stop("All rows are dropped! Exit!!")
  formula <- as.formula(paste(". ~", colnames(df)[1]))
  cat("the formula is: ")
  print(formula); cat("\n")
  agg <- aggregate(formula, data, FUN = sum)
  cat("aggregation success!!\n\n")
  options(error = error.default)
  return(agg)
  }

agg <- foo(df)
VAL1 <- c("AA", "BB", "CC", "DD", "BB", "DD", "AA", "DD")
Num1 <- c(1, 2, 1, 3, 4, 4, 6, 2) 
Num2 <- c(3, 3, 2, 1, 1, 2,4, 4) 
Num3 <- c(2, 2, 3, 4, 3, 5, 5, 7) 
df <- data.frame(VAL1, Num1, Num2, Num3)
VAL1 <- c("AA", "BB", "CC", "DD", "BB", "DD", "AA", "DD")
Num1 <- c(NA, NA, 1, 3, 4, 4, 6, 2) 
Num2 <- c(3, 3, NA, NA, NA, 2,4, 4) 
Num3 <- c(2, 2, 3, 4, 3, NA, NA, NA) 
df <- data.frame(VAL1, Num1, Num2, Num3)
df[is.na(df)] <- 0   ## set all NA to 0

foo <- function (df) {
  n <- nrow(df)
  value_df <- df[, -1]  ## data frame with values
  tot <- colSums(value_df)  ## column sums
  ratio <- value_df / rep(tot, each = n)  ## rescaling
  string_df <- df[1]
  data <- cbind(string_df ,ratio)
  formula <- as.formula(paste(". ~", colnames(df)[1]))
  aggregate(formula, data, FUN = sum)
  }

agg <- foo(df)   ## use `NA` corrected df to aggregate