r语言 - 为什么pivot_longer列类型从'double'转换为'list'



在我的数据框转换为 long 后,经过操作,然后转换回宽,列类型似乎已更改。

x = data.frame(A = rnorm(100), 
b = rnorm(100)) %>%
mutate(id = row_number())
typeof(x[,'A'])
# produces "double"
x3 = x %>% pivot_longer(-id) %>%
pivot_wider(names_from = name, values_from = value)
typeof(x3[,'A'])
# produces "list"
typeof(x3[,'A'] %>% unlist())
# produces "double"

这是一个问题,因为我想遍历数组并将 df 的一部分分配给数组的各个部分。例如:

arr = array(dim = c(2,100))
# arr has type 'logical'
arr[,1] = x3[,'A']
# arr now has type 'list'
arr[,2] = x3[,'A']
#last line gives me: 'Error in arr[, 2] = x3[, "A"] : incorrect number of subscripts on matrix'

将数组的一部分分配给列表似乎将整个内容转换为列表。我相信我可以通过用arr[,2] = x3[,'A'] %>% unlist()替换最后一行来解决这个问题,但这是我想知道发生了什么的奇怪行为。

原因是x3是一个tibble,使用x3[, 'A']仍然是一个tibble,您可以通过class(x3[,'A'])进行检查。作为tibbledata.frame基本上是一种listtypeof会给你一种list(例如检查typeof(mtcars))。这是data.frametibble之间的区别之一。在data.framex3[,'A']的情况下,默认情况下将简化为向量,而tibble则不是这种情况。

如果你想要一个向量,那么在使用x3[,'A', drop = TRUE]x3[["A"]]x3$Atibble切片时,你必须更加明确:

library(dplyr, warn=FALSE)
library(tidyr)
set.seed(123)
x = data.frame(A = rnorm(100), 
b = rnorm(100)) %>%
mutate(id = row_number())
x3 <- x %>% 
pivot_longer(-id) %>%
pivot_wider(names_from = name, values_from = value)
class(x3[,'A'])
#> [1] "tbl_df"     "tbl"        "data.frame"
typeof(x3$A)
#> [1] "double"
typeof(x3[,'A', drop = TRUE])
#> [1] "double"
typeof(x3[['A']])
#> [1] "double"

相关内容

最新更新