希望我能解释一下这个问题:
我有一个以下形式的函数,它返回两个感兴趣的值。
return_network <- function(team_id){
... [ do something to produce adjacency matrix and network density measures]
g <- graph.adjacency(co_occur, weighted=TRUE, mode ='undirected')
g <- simplify(g)
return(c(weighted_network_density, g))
然后,我想迭代数据帧中的列,应用上面的函数,并将其解压缩到两列。我尝试过以下方法:
team_measures[, c('weighted_network_density', 'graph_object')] <- apply(team_measures[, "team_id", drop=F], 1, return_network)
但是,我收到一条警告信息:
Warning message:
In `[<-.data.frame`(`*tmp*`, , c("weighted_network_density", "graph_object"), :
provided 429 variables to replace 2 variables
结果数据框充满了废话。
这里是对问题的猜测:apply
中每一步的输出都被绑定为列,即使你应用了行,所以结果是从(至少我)期望的方式转换。下面我的简单示例不会重现您的错误,因为如果我们有这个data.frame:
df <- data.frame(dog = c(1,2,3), cat = c(4,5,6), fish = c(7,8,9))
df
dog cat fish
1 1 4 7
2 2 5 8
3 3 6 9
如果我们通过返回2个值的行应用函数,我们得到一个包含2行的矩阵:
apply(df, 1, function(x) c(x['dog'], x['cat']))
[,1] [,2] [,3]
dog 1 2 3
cat 4 5 6
如果我们将它作为矩阵保留,我们可以将它传递到数据帧的2列而不会显示错误消息,但它会以一种奇怪的方式强制它,从而产生无意义的结果:
df2 <- df
df2[,c('cat', 'fish')] <- apply(df, 1, function(x) c(x['dog'], x['cat']))
df2
dog cat fish
1 1 1 5
2 2 4 3
3 3 2 6
如果我们在分配之前将结果转换为data.frame(可能在代码中的某处发生),我们会得到类似的错误:
df2[,c('cat', 'fish')] <- as.data.frame(apply(df, 1, function(x) c(x['dog'], x['cat'])))
Error in `[<-.data.frame`(`*tmp*`, , c("cat", "fish"), value = list(V1 = c(1, :
replacement element 1 has 2 rows, need 3
在传递结果之前将结果转置为静音错误并导致数据以正确的方式放入数据中:
df2[,c('cat', 'fish')] <- as.data.frame(t(apply(df, 1, function(x) c(x['dog'], x['cat']))))
df2
dog cat fish
1 1 1 4
2 2 2 5
3 3 3 6