将自定义函数应用于r中的每一行

背部

我创建了一个函数来计算数据帧中一行的rollmean:

rollmean_circular <- function(x) {t(rollmean(t(cbind(x[9:10],x,x[1:2])),5))}

df <- structure(list(X1 = c(5L, 5L, 9L, 0L, 9L, 10L, 10L, 1L, 0L, 10L
), X2 = c(6L, 8L, 6L, 9L, 7L, 5L, 0L, 7L, 5L, 8L), X3 = c(10L, 
7L, 2L, 1L, 2L, 10L, 2L, 9L, 6L, 4L), X4 = c(6L, 0L, 9L, 1L, 
6L, 8L, 3L, 7L, 8L, 1L), X5 = c(0L, 9L, 8L, 3L, 1L, 8L, 3L, 9L, 
5L, 2L), X6 = c(0L, 10L, 9L, 10L, 3L, 1L, 6L, 0L, 6L, 9L), X7 = c(9L, 
10L, 0L, 10L, 10L, 9L, 0L, 1L, 10L, 2L), X8 = c(2L, 6L, 3L, 7L, 
7L, 9L, 8L, 9L, 1L, 0L), X9 = c(0L, 8L, 8L, 9L, 0L, 5L, 9L, 9L, 
4L, 8L), X10 = c(1L, 4L, 3L, 0L, 1L, 7L, 3L, 6L, 5L, 0L)), class = "data.frame", row.names = c(NA, 
-10L))

   X1 X2 X3 X4 X5 X6 X7 X8 X9 X10
1   5  6 10  6  0  0  9  2  0   1
2   5  8  7  0  9 10 10  6  8   4
3   9  6  2  9  8  9  0  3  8   3
4   0  9  1  1  3 10 10  7  9   0
5   9  7  2  6  1  3 10  7  0   1
6  10  5 10  8  8  1  9  9  5   7
7  10  0  2  3  3  6  0  8  9   3
8   1  7  9  7  9  0  1  9  9   6
9   0  5  6  8  5  6 10  1  4   5
10 10  8  4  1  2  9  2  0  8   0

给定该函数的向量,它将最后2个元素附加到前面,将前2个元素附加到后面,然后进行rollmean,这样在前面或后面就不会有任何NA。

当我将1行df应用于时,它可以完美工作。

r = df[1,]
rollmean_circular[r]

  [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
1  4.4  5.6  5.4  4.4    5  3.4  2.2  2.4  3.4   2.8

但是,当我使用apply将此功能应用于数据框的每一行时,它返回一个logical(0)

apply(df,1,rollmean_circular)

logical(0)

我能知道我在想什么吗?

当我应用为单行提供相同输出的另一个函数时,它将起作用:

stdize <- function(x, na.rm=T) {(x - min(x, na.rm=T)) / (max(x, na.rm=T) - min(x, na.rm=T))}

stdize(r)

   X1  X2 X3  X4 X5 X6  X7  X8 X9 X10
1 0.5 0.6  1 0.6  0  0 0.9 0.2  0 0.1

apply(df,1,stdize)

    [,1] [,2]      [,3] [,4] [,5]      [,6] [,7]      [,8] [,9] [,10]
X1   0.5  0.5 1.0000000  0.0  0.9 1.0000000  1.0 0.1111111  0.0   1.0
X2   0.6  0.8 0.6666667  0.9  0.7 0.4444444  0.0 0.7777778  0.5   0.8
X3   1.0  0.7 0.2222222  0.1  0.2 1.0000000  0.2 1.0000000  0.6   0.4
X4   0.6  0.0 1.0000000  0.1  0.6 0.7777778  0.3 0.7777778  0.8   0.1
X5   0.0  0.9 0.8888889  0.3  0.1 0.7777778  0.3 1.0000000  0.5   0.2
X6   0.0  1.0 1.0000000  1.0  0.3 0.0000000  0.6 0.0000000  0.6   0.9
X7   0.9  1.0 0.0000000  1.0  1.0 0.8888889  0.0 0.1111111  1.0   0.2
X8   0.2  0.6 0.3333333  0.7  0.7 0.8888889  0.8 1.0000000  0.1   0.0
X9   0.0  0.8 0.8888889  0.9  0.0 0.4444444  0.9 1.0000000  0.4   0.8
X10  0.1  0.4 0.3333333  0.0  0.1 0.6666667  0.3 0.6666667  0.5   0.0
杰伊

似乎您在函数中混淆了向量和矩阵。您可以unlist在函数中,然后t转入其他位置。

rollmean_circular <- function(x) zoo::rollmean(unlist(c(x[9:10], x, x[1:2])),5)

t(apply(df, 1, rollmean_circular))
#       X1  X2  X3  X4  X5  X6  X7  X8  X9 X10
#  [1,] 4.4 5.6 5.4 4.4 5.0 3.4 2.2 2.4 3.4 2.8
#  [2,] 6.4 4.8 5.8 6.8 7.2 7.0 8.6 7.6 6.6 6.2
#  [3,] 5.6 5.8 6.8 6.8 5.6 5.8 5.6 4.6 4.6 5.8
#  [4,] 3.8 2.2 2.8 4.8 5.0 6.2 7.8 7.2 5.2 5.0
#  [5,] 3.8 5.0 5.0 3.8 4.4 5.4 4.2 4.2 5.4 4.8
#  [6,] 7.4 8.0 8.2 6.4 7.2 7.0 6.4 6.2 8.0 7.2
#  [7,] 4.8 3.6 3.6 2.8 2.8 4.0 5.2 5.2 6.0 6.0
#  [8,] 6.4 6.0 6.6 6.4 5.2 5.2 5.6 5.0 5.2 6.4
#  [9,] 4.0 4.8 4.8 6.0 7.0 6.0 5.2 5.2 4.0 3.0
# [10,] 6.0 4.6 5.0 4.8 3.6 2.8 4.2 3.8 4.0 5.2

这也可以在基数R中完成(带有大部分@MattiPastell的功劳):

fun <- function(x, n=5) na.omit(filter(c(tail(x, 2), x, head(x, 2)), rep(1 / n, n), sides=2))
t(apply(df, 1, fun))
#       [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
#  [1,]  4.4  5.6  5.4  4.4  5.0  3.4  2.2  2.4  3.4   2.8
#  [2,]  6.4  4.8  5.8  6.8  7.2  7.0  8.6  7.6  6.6   6.2
#  [3,]  5.6  5.8  6.8  6.8  5.6  5.8  5.6  4.6  4.6   5.8
#  [4,]  3.8  2.2  2.8  4.8  5.0  6.2  7.8  7.2  5.2   5.0
#  [5,]  3.8  5.0  5.0  3.8  4.4  5.4  4.2  4.2  5.4   4.8
#  [6,]  7.4  8.0  8.2  6.4  7.2  7.0  6.4  6.2  8.0   7.2
#  [7,]  4.8  3.6  3.6  2.8  2.8  4.0  5.2  5.2  6.0   6.0
#  [8,]  6.4  6.0  6.6  6.4  5.2  5.2  5.6  5.0  5.2   6.4
#  [9,]  4.0  4.8  4.8  6.0  7.0  6.0  5.2  5.2  4.0   3.0
# [10,]  6.0  4.6  5.0  4.8  3.6  2.8  4.2  3.8  4.0   5.2

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

将自定义函数应用于R中数据帧中每一行的两列

如何将自定义功能应用于每一行的熊猫数据框

如何将自定义函数应用于数据框的每一列

熊猫将自定义功能应用于由另一列分组的一列的每一行

将自定义函数一次应用于分组的数据帧n行

R将自定义矢量化函数应用于数据帧中的行,特定列

将自定义函数应用于多个文件并在R中创建唯一的csv输出

将自定义函数应用于依赖于可变数量的前一行的 Pandas 数据帧

将自定义函数应用于数据框

将自定义函数应用于数据框

将自定义函数应用于numpy矩阵

R按一列分组并将自定义函数应用于另一列

创建评分函数并将其应用于R中的每一行

如何将函数应用于R中的每一行数据框?

将自定义函数应用于 DF 列表,将另一个列表作为输入 - R

将自定义函数应用于pandas中的一列列表,如何处理异常?

将自定义函数应用于熊猫中的多列

如何在PyTorch中将自定义函数应用于矩阵中的特定列

如何将自定义重试策略应用于 Azure 函数中的 Eventhub 绑定

将自定义函数应用于熊猫数据框中的每个列组合

将自定义函数应用于数据框中的列对

R - 将函数应用于数据帧的每一行,函数的参数是来自每一行的值

将自定义功能应用于R中的多个组

将函数应用于ndarray的每一行

当函数需要多个输入时,如何将函数应用于R中数据帧的每一行?

如何将函数应用于数据集的行并获取 R 中每一行的结果

如何将可变的gsub模式(可变函数)应用于R中的data.table的每一行

r-将函数应用于data.table的每一行

如何将函数应用于熊猫中每一行的对象属性