我想要在第五列(“距离”)下订购以下数据框。 当我尝试`
时df.order <- df[order(df[, 5]), ]
我总是收到以下错误消息。
Error in order(df[, 5]) : unimplemented type 'list' in 'orderVector1'`
我不知道为什么R将我的数据框视为列表。正在运行is.data.frame(df)
会返回TRUE
。我必须承认is.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")
答案 0 :(得分:5)
您的数据框包含列表,而不是矢量。您可以使用as.data.frame
和unlist
:
df2 <- as.data.frame(lapply(df, unlist))
现在,新数据框可以按预期方式排序:
df2[order(df2[, 5]), ]
答案 1 :(得分: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")
请注意,list
仅出现一次。并且所有值都包含在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
答案 2 :(得分:1)
这会将列表的data.frame转换为矩阵:
mat <- sapply(df,unlist)
现在你可以订购了。
mat[order(mat[,5]),]
如果所有列都是一种类型,例如数字,则通常优选矩阵,因为矩阵上的操作比data.frames上的操作更快。但是,您可以使用as.data.frame(mat)
转换为data.frame。
顺便说一下,data.frame是一种特殊的列表,因此is.list
会为每个data.frame返回TRUE
。
答案 3 :(得分: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)