【问题标题】:bind vectors in a loop using R使用 R 在循环中绑定向量
【发布时间】:2016-10-28 23:50:57
【问题描述】:

我需要在数据框中添加remove_outliers 函数返回的向量[属性]。现在,我得到了一个大矩阵。我试过追加方法(如下)

# function to calculate IQR and upper and lower limit of given attribute
remove_outliers <- function(attribute, na.rm = TRUE, ...) {
  IQR_val <- quantile(attribute, probs=c(.25, .75), na.rm = na.rm, ...)
  LF <- 1.5 * IQR(attribute, na.rm = na.rm)
  attribute_W_NA <- attribute
  attribute_W_NA[attribute < (IQR_val[1] - LF)] <- NA
  attribute_W_NA[attribute > (IQR_val[2] + LF)] <- NA
  attribute_W_NA
}

cleaned_data <- NULL

for(i in 1:ncol(data_rm_val)){
  # cleaned data with NA entries replacing outliers

    cleaned_data <- cbind(cleaned_data, remove_outliers(data_rm_val[,i]))

}

它会导致大矩阵

这是输入数据框:

当前输出是:(在循环中使用 cbind)

并且期望的结果应该是具有相同行数和列数的数据框。

任何帮助将不胜感激。 PS:我是 R 和数据科学的新手。

【问题讨论】:

  • 对于循环尝试cbind 而不是append,尽管apply(data_rm_val, 2, remove_outliers) 可能会更快更好地满足您的需求。
  • 如果您要使用循环,请预先分配适当大小的对象,否则您将获得糟糕的性能。也就是说,有更好的方法可以在没有循环的情况下做到这一点。如果您在问题中添加一些数据,可能会有人发布。
  • 好的。我会试试的。我也试过 cbind 。我有一个数据框(一个大矩阵)。
  • 数据框不是你想要的结果吗?你在循环之后调用它。请显示当前和期望的结果。

标签: r dataframe data-science cbind


【解决方案1】:

只需将lapply 与您的用户定义函数一起使用,即可避免绑定或附加。在数据帧上使用 lapply() 时,您对每一列运行操作:

cleaned_data <- data.frame(lapply(data_rm_val, remove_outliers))

现在上面假设你定义的函数,remove_outliers 返回一个向量类型。为确保向量始终输出,请考虑将vapply() 定义为等于输入或nrow(data_rm_val) 的长度:

cleaned_data <- data.frame(vapply(data_rm_val, remove_outliers, numeric(nrow(data_rm_val))))

以上两个选项适用于随机数数据集(因为 OP 不提供示例数据):

data_rm_val <- data.frame(matrix(rnorm(25),5))

#           X1         X2         X3         X4          X5
# 1  0.4303766  1.8152041  0.3355174 -0.4880282 -0.63612820
# 2  0.2876950 -0.7613642 -1.5046115  0.1821653  0.09397964
# 3 -2.3402548 -0.6771749 -2.0122667 -0.9442210 -1.30994853
# 4  1.4224979 -1.7940421 -0.5110736 -0.2837820 -0.24240172
# 5 -0.7484131 -0.8159326 -1.2690513 -1.0422656  1.23811458

cleaned_data <- data.frame(lapply(data_rm_val, remove_outliers))

#           X1         X2         X3         X4          X5
# 1  0.4303766         NA  0.3355174 -0.4880282 -0.63612820
# 2  0.2876950 -0.7613642 -1.5046115  0.1821653  0.09397964
# 3 -2.3402548 -0.6771749 -2.0122667 -0.9442210 -1.30994853
# 4  1.4224979         NA -0.5110736 -0.2837820 -0.24240172
# 5 -0.7484131 -0.8159326 -1.2690513 -1.0422656          NA

cleaned_data2 <- data.frame(vapply(data_rm_val, 
                                   remove_outliers, numeric(nrow(data_rm_val))))

#           X1         X2         X3         X4          X5
# 1  0.4303766         NA  0.3355174 -0.4880282 -0.63612820
# 2  0.2876950 -0.7613642 -1.5046115  0.1821653  0.09397964
# 3 -2.3402548 -0.6771749 -2.0122667 -0.9442210 -1.30994853
# 4  1.4224979         NA -0.5110736 -0.2837820 -0.24240172
# 5 -0.7484131 -0.8159326 -1.2690513 -1.0422656          NA

【讨论】:

  • 太棒了!很高兴我能帮上忙。请接受解决方案以确认解决方案。
  • 很遗憾,我在这里的名声很低。只能为你祈祷。保持祝福!
  • 不正确。原始发帖人可以接受他们自己问题的任何答案(请参阅check mark 解决方案一侧)。这样做你甚至可以获得积分!
猜你喜欢
  • 1970-01-01
  • 2014-09-20
  • 2018-11-25
  • 2021-12-01
  • 2017-07-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多