如何解决如何强制多个列类?
我有一个类向量 class_vector <- c("string","integer","numeric","logical" )
,我需要用它来将每个列类强制转换为。
示例数据框:
df <- data.frame(letters = letters[sample.int(20,10)],integers = sample.int(100,10),numbers = rnorm(10),logical = sample.int(2,10,replace = T)-1)
我尝试了 apply 函数的不同变体,但我只成功地将多个列类更改为一个类(例如“字符”),但我似乎无法使用向量/列表来将不同的列更改为不同的类。
解决方法
根据@GuedesBF 的建议:使用 rlang
将字符串转换为函数。
使用罗纳克的class_vector
。
library(rlang)
library(purrr)
map2_df(df,class_vector,function(col,typ) as_function(paste0("as.",typ))(col))
输出:
letters integers numbers logical
<chr> <int> <dbl> <lgl>
1 s 11 -0.782 TRUE
2 o 77 -0.246 TRUE
3 t 92 0.101 FALSE
4 a 44 -0.596 TRUE
5 h 15 0.337 TRUE
6 i 8 0.692 FALSE
7 b 28 0.520 FALSE
8 p 82 0.263 FALSE
9 f 61 1.34 TRUE
10 j 81 -1.47 TRUE
,
您可以使用 purrr:map2_dfc
,在将字符串更改为字符后,如 Ronaks 的答案
library(purrr)
map2_dfc(df,~ {class(.x)<-.y; .x})
# A tibble: 10 x 4
letters integers numbers logical
<string> <int> <dbl> <lgl>
1 d 97 -0.621 TRUE
2 g 85 -2.21 TRUE
3 a 21 1.12 TRUE
4 b 54 -0.0449 TRUE
5 m 74 -0.0162 FALSE
6 s 7 0.944 FALSE
7 k 73 0.821 TRUE
8 q 79 0.594 FALSE
9 n 99 0.919 TRUE
10 c 37 0.782 TRUE
,
我们可以在 for
中使用一个简单的 base R
循环
for(i in seq_along(df)) class(df[[i]]) <- class_vector[i]
-输出
> str(df)
'data.frame': 10 obs. of 4 variables:
$ letters : chr "t" "c" "n" "f" ...
$ integers: int 56 68 27 42 47 79 62 2 84 12
$ numbers : num 1.039 -1.25 2.262 -1.516 -0.575 ...
$ logical : logi FALSE TRUE FALSE TRUE FALSE TRUE ...
或在 lapply
中使用 base R
df[] <- lapply(seq_along(df),function(i) `class<-`(df[[i]],class_vector[i]))
> str(df)
'data.frame': 10 obs. of 4 variables:
$ letters : 'string' chr "k" "d" "o" "h" ...
$ integers: int 85 58 88 3 38 93 63 20 34 89
$ numbers : num -0.718 0.903 1.738 -0.345 1.021 ...
$ logical : logi FALSE FALSE TRUE FALSE FALSE TRUE ...
或者将 dplyr
与 mutate
和 across
一起使用
library(dplyr)
df %>%
mutate(across(everything(),~ `class<-`(.,class_vector[match(cur_column(),names(df))])))
letters integers numbers logical
1 q 49 0.93598772 TRUE
2 c 74 0.53479870 TRUE
3 p 54 0.57934890 TRUE
4 h 11 0.44393120 FALSE
5 j 95 1.46833083 TRUE
6 g 13 -1.82314003 TRUE
7 n 41 -0.89846695 TRUE
8 f 75 -0.40110724 FALSE
9 e 18 -0.48233063 FALSE
10 i 26 -0.05029243 FALSE
或者如果'class_vector'是一个命名向量,即命名为数据集的列名,这更简单
names(class_vector) <- names(df)
df %>%
mutate(across(everything(),class_vector[cur_column()])))
,
R 中没有 'string'
类。将 'string'
更改为 'character'
后,您可以使用 class
函数根据向量更改每列的类。
class_vector <- c("character","integer","numeric","logical" )
df[] <- Map(`class<-`,df,class_vector)
str(df)
#'data.frame': 10 obs. of 4 variables:
# $ letters : chr "d" "b" "j" "n" ...
# $ integers: int 94 27 72 60 71 26 31 90 18 99
# $ numbers : num 0.7803 0.0959 0.2431 0.0372 0.4021 ...
# $ logical : logi FALSE TRUE TRUE FALSE TRUE TRUE ...
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。