微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何强制多个列类?

如何解决如何强制多个列类?

我有一个数据框,列是不同的类,包括字符串、数字、整数等

我有一个类向量 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 ...

或者将 dplyrmutateacross 一起使用

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 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?