apply()和adply()

时间:2015-07-04 18:31:57

标签: r plyr

我无法弄清楚为什么adply()会返回包含原始变量的data.frame,而apply()则不会。基本上,看起来adply()只是另一个mutate()。我错过了什么?

测试数据:

library(pacman)
p_load(plyr)

g_loadings = c(.50, .60, .80,
               .60, .70, .60,
               .80, .50, .30)

group_1_loadings = c(.50, .50, .50,
                     0, 0, 0,
                     0, 0, 0)

group_2_loadings = c(0, 0, 0,
                     .50, .50, .50,
                     0, 0, 0)

group_3_loadings = c(0, 0, 0,
                     0, 0, 0,
                     .50, .50, .50)

d = data.frame(g_loadings,
               group_1_loadings,
               group_2_loadings,
               group_3_loadings)

adply()

adply(d, 1, function(x) {
  var_g_group = sum(x^2)
  var_remain = 1 - var_g_group
  loading_specificity = sqrt(var_remain)
  return(loading_specificity)
  }
)

返回:

  g_loadings group_1_loadings group_2_loadings group_3_loadings        V1
1        0.5              0.5              0.0              0.0 0.7071068
2        0.6              0.5              0.0              0.0 0.6244998
3        0.8              0.5              0.0              0.0 0.3316625
4        0.6              0.0              0.5              0.0 0.6244998
5        0.7              0.0              0.5              0.0 0.5099020
6        0.6              0.0              0.5              0.0 0.6244998
7        0.8              0.0              0.0              0.5 0.3316625
8        0.5              0.0              0.0              0.5 0.7071068
9        0.3              0.0              0.0              0.5 0.8124038

apply()

apply(d, 1, function(x) {
  var_g_group = sum(x^2)
  var_remain = 1 - var_g_group
  loading_specificity = sqrt(var_remain)
  return(loading_specificity)
  }
)

返回:

[1] 0.7071068 0.6244998 0.3316625 0.6244998 0.5099020 0.6244998 0.3316625 0.7071068 0.8124038

为什么adply()不会与apply()返回相同的内容?

1 个答案:

答案 0 :(得分:3)

这些plyr函数的命名约定是第一个字母对应于它操作的数据结构,第二个字母对应于它返回的数据结构。因此,adply对数组进行操作并返回data.frame。您可以使用.expand选项指定要返回的列。

adply(d, 1, function(x) {
  var_g_group = sum(x^2)
  var_remain = 1 - var_g_group
  loading_specificity = sqrt(var_remain)
  return(loading_specificity)
  }, .expand=F)
#   X1        V1
# 1  1 0.7071068
# 2  2 0.6244998
# 3  3 0.3316625
# 4  4 0.6244998
# 5  5 0.5099020
# 6  6 0.6244998
# 7  7 0.3316625
# 8  8 0.7071068
# 9  9 0.8124038

或者使用aaply取回一个数组(这与apply返回的数组相同,除了apply在结果上使用as.vector

aaply(d, 1, function(x) {
  var_g_group = sum(x^2)
  var_remain = 1 - var_g_group
  loading_specificity = sqrt(var_remain)
  return(loading_specificity)
  }, .expand=F)
#         1         2         3         4         5         6         7         8 
# 0.7071068 0.6244998 0.3316625 0.6244998 0.5099020 0.6244998 0.3316625 0.7071068 
#         9 
# 0.8124038