9

5列目(「距離」)で注文したい次のデータフレームがあります。`を試してみると

df.order <- df[order(df[, 5]), ]

私はいつも次のエラーメッセージを受け取ります。

Error in order(df[, 5]) : unimplemented type 'list' in 'orderVector1'`

Rが私のデータフレームをリストと見なす理由がわかりません。実行するとis.data.frame(df)戻りますTRUEis.list(df)私はそれも返すことを認めなければなりませんTRUE。データフレームをリストではなくデータフレームのみにすることはできますか?ご協力いただきありがとうございます。

structure(list(ID = list(1, 2, 3, 4, 5, 6, 7, 8, 9, 10), 
               Latitude = list(50.7368, 50.7368, 50.7368, 50.7369, 50.7369, 50.737, 50.737, 50.7371, 50.7371, 50.7371), 
               Longitude = list(6.0873, 6.0873, 6.0873, 6.0872, 6.0872, 6.0872, 6.0872, 6.0872, 6.0872, 6.0872), 
               Elevation = list(269.26, 268.99, 268.73, 268.69, 268.14, 267.87, 267.61, 267.31, 267.21, 267.02), 
               Distance = list(119.4396, 119.4396, 119.4396, 121.199, 121.199, 117.5658, 117.5658, 114.9003, 114.9003, 114.9003), 
               RxPower = list(-52.6695443922406, -52.269130891243, -52.9735258244422, -52.2116571930007, -51.7784534281727, -52.7703448813654, -51.6558862949081, -52.2892907635308, -51.8322993596551, -52.4971436682333)), 
          .Names = c("ID", "Latitude", "Longitude", "Elevation", "Distance", "RxPower"),
          row.names = c(NA, 10L), class = "data.frame")
4

4 に答える 4

10

データフレームには、ベクトルではなくリストが含まれています。as.data.frameおよびを使用して、このデータフレームを「クラシック」形式に変換できますunlist

df2 <- as.data.frame(lapply(df, unlist))

これで、新しいデータフレームを意図した方法で並べ替えることができます。

df2[order(df2[, 5]), ]
于 2013-01-25T12:30:40.373 に答える
3

私は小さな例で何が問題なのかを説明しました:

df <- structure(list(ID = c(1, 2, 3, 4), 
          Latitude = c(50.7368, 50.7368, 50.7368, 50.7369), 
          Longitude = c(6.0873, 6.0873, 6.0873, 6.0872), 
          Elevation = c(269.26, 268.99, 268.73, 268.69), 
          Distance = c(119.4396, 119.4396, 119.4396, 121.199), 
          RxPower = c(-52.6695443922406, -52.269130891243, -52.9735258244422, 
                         -52.2116571930007)), 
          .Names = c("ID", "Latitude", "Longitude", "Elevation", "Distance", "RxPower"), 
          row.names = c(NA, 4L), class = "data.frame")

list1回だけ発生することに注意してください。そして、すべての値はでラップされc(.)、ではありませんlist(.)。これがsapply(df, class)、データに対して実行すると、すべての列がクラスを持つ結果になった理由listです。

今、

> sapply(df, classs)
#       ID  Latitude Longitude Elevation  Distance   RxPower 
# "numeric" "numeric" "numeric" "numeric" "numeric" "numeric" 

現在order動作しています:

> df[order(df[,4]), ]  
#   ID Latitude Longitude Elevation Distance   RxPower
# 4  4  50.7369    6.0872    268.69 121.1990 -52.21166
# 3  3  50.7368    6.0873    268.73 119.4396 -52.97353
# 2  2  50.7368    6.0873    268.99 119.4396 -52.26913
# 1  1  50.7368    6.0873    269.26 119.4396 -52.66954
于 2013-01-25T12:17:33.060 に答える
1

これにより、リストのdata.frameがマトリックスに変わります。

mat <- sapply(df,unlist)

今、あなたはそれを注文することができます。

mat[order(mat[,5]),]

すべての列が1つのタイプ、たとえば数値の場合、行列の操作はdata.framesの操作よりも高速であるため、行列の方が望ましい場合がよくあります。ただし、を使用してdata.frameに変換できますas.data.frame(mat)

ところで、data.frameは特別な種類のリストであるため、すべてのdata.frameに対してis.list返されます。TRUE

于 2013-01-25T12:24:18.890 に答える
0

この同じ問題に遭遇しました。これは私のために働きました(多分それは同じ問題を抱えていてこのページでつまずいた他の誰かを助けるかもしれません)。

私は次のような構造を持っていました:

lst <- list(row1 = list(col1="A",col2=1,col3="!"), row2 = list(col1="B",col2=2,col3="@"))
> lst
$row1
$row1$col1
[1] "A"

$row1$col2
[1] 1

$row1$col3
[1] "!"


$row2
$row2$col1
[1] "B"

$row2$col2
[1] 2

$row2$col3
[1] "@"

やっていた:

df <- as.data.frame(do.call(rbind, lst))

そして、私がしようとしたときにあなたが得ていたのと同じエラーを受け取り続けましたdf[order(df$col1),]。私がしなければならなかったことが判明しました:

df <- do.call(rbind.data.frame, lst)
于 2019-02-28T16:38:38.843 に答える