在我的数据框转换为 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'])
进行检查。作为tibble
或data.frame
基本上是一种list
typeof
会给你一种list
(例如检查typeof(mtcars)
)。这是data.frame
和tibble
之间的区别之一。在data.frame
x3[,'A']
的情况下,默认情况下将简化为向量,而tibble
则不是这种情况。
如果你想要一个向量,那么在使用x3[,'A', drop = TRUE]
或x3[["A"]]
或x3$A
从tibble
切片时,你必须更加明确:
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"