-1

を使用してキーと値の変数のペアをピボットしようとしていますtidyr:spread()

id <- c(0,1,2,3,4,5,6,7,8,9)
key1 <- c("a", "a", "b", "b", "c","a", "a", "b", "b", "c")
val1 <- c(1,2,3,1,2,3,1,2,3,1)
key2 <- c("d",NA,NA,NA,"e","d","d",NA,"b",NA)
val2 <- c(1,NA,NA,NA,2,3,NA,NA,3,NA)
key3 <- c("x",NA,NA,NA,"e","d",NA,NA,NA,NA)
val3 <- c(0,NA,NA,NA,NA,3,1,NA,NA,NA)
df = data.frame(id, key1, val1, key2, val2, key3, val3) 
library(tidyr)
c1 <- spread(df, key1, val1, fill = 0, convert = FALSE)
c2 <- spread(c1, key2, val2, fill = 0, convert = FALSE)
c3 <- spread(c2, key3, val3, fill = 0, convert = FALSE) 

スプレッド()の実行中に、次のエラーが発生します。

[.data.frame(data, setdiff(names(data), c(key_col, value_col))) のエラー: 未定義の列が選択されました

エラーが示すように、問題は変数名ではなく値にあると思われます。何を探すべきか考えてみてください。

同じトークンで、キーと値の変数の複数のペアを分散するためのより効率的な構文方法はありますか?

4

1 に答える 1

3

あなたは使用することができますMap

library(tidyr)
res <- do.call(cbind,Map(function(x,y) {x1 <- data.frame(x,y)
        r1 <- spread(x1, x,y, fill=0, convert=FALSE)
        r1[!is.na(names(r1))] }, 
   df[-1][c(TRUE,FALSE)], df[-1][c(FALSE, TRUE)]))

names(res) <- sub('.*\\.', '', names(res))
cbind(df, res) 
于 2015-07-16T13:47:33.333 に答える