【问题标题】:Apply function to convert dataframe rows to vectors应用函数将数据帧行转换为向量
【发布时间】:2018-04-09 14:08:15
【问题描述】:

我有一个尺寸为 12665x784 的数据框,我需要在每一行上调用一个函数(此函数需要来自数据框的 1x784 输入和一个相同大小的常量)并将结果存储在另一个向量中。使用for循环的代码如下所示:

sample <- 1:20
my.constant <- 1:5
dim(sample) <- c(4, 5)
df <- as.data.frame(sample)

my.function <- function (x, y){
  y <- as.matrix(y)
  x <- as.matrix(x)
  return(x%*%y)
}

result <- c()

for (row in 1:nrow(df)) {
  result<- c(result, my.function(df[row, ], my.constant))
}

我尝试了以下方法,但没有奏效:

result <- sapply(lapply(df, as.vector), my.function, my.constant)

【问题讨论】:

  • 请阅读有关how to ask a good question 的信息以及如何提供reproducible example。这将使其他人更容易帮助您。
  • 你可以?apply
  • @Jaap,我编辑了问题以提供可重现的示例。对此感到抱歉。
  • as.matrix(df) %*% my.constantc(as.matrix(df) %*% my.constant)

标签: r vectorization lapply sapply


【解决方案1】:
  1. 你的函数是矩阵积吗?

  2. 您的数据只是数值吗?

那么你只需要一个矩阵和一个向量之间的矩阵乘积:

as.matrix(df) %*% my.constant

如果您想要一个向量而不是单列矩阵,则可能使用drop()

【讨论】:

  • 1.实际上,我的功能比这复杂得多。我使用点积使其变得简单。 2.所有数据都是数值。
  • 好的。你能使用更复杂的函数吗?我将使用这些新信息编辑我的答案。
【解决方案2】:

看看这是否有帮助...

id<-c("A", "B", "C")
v1<-c(10, 4, 9)
df<-data.frame(id, v1)


result<-unlist(lapply(df$v1, function(x){
  x+1
}))

result

【讨论】:

  • 你为什么要标记我的答案?我给了您一个可重现的示例,说明如何将您创建的任何函数应用于所有记录,然后按照您的要求将它们收集到向量中。你的功能没有意义......你需要先解决这个问题。您创建了一个数据框,但您的函数有两个输入...
  • 在您的情况下,unlist(lapply(...))sapply(...) 相同。同时,问题中有一个可重复的示例。
猜你喜欢
  • 2017-12-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-11
  • 2020-09-08
  • 1970-01-01
  • 2016-11-29
  • 2021-08-17
相关资源
最近更新 更多