希望我能解释一下这个问题:
我具有以下形式的函数,该函数返回两个感兴趣的值。
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
并且结果数据帧充满了废话。
答案 0 :(得分:3)
这里有一个问题的猜测: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