如何在空 R 数据框中设置多列的列类型?
How can I set column types of several columns in empty R data frame?
我正在尝试创建一个具有特定列名称和列类型的空数据框。我拥有的是一个接收具有以下结构的列表的函数:
list$
$name_1$
$class
$more_stuff
$name_2$
$class
$more_stuff
...
因此,我创建了一个空数据框:
df <- data.frame(matrix(ncol = length(names(my_list)), nrow = 0))
colnames(df) <- names(my_list)
# set column types
列表中的每一项都有一个包含数据类型的 'class' 属性。这些可以是:“字符”、“数字”、“日期时间”、“布尔值”,它们必须转换为:
"character" -> character
"numeric" -> numeric
"datetime" -> datetime<UTC>
"boolean" -> character
因为这个数据框将被连接到另一个具有这些列的数据框。
我试过类似的方法,但日期时间列不正确:
for (i in c(1:length(my_list))) {
cast_function = switch(my_list[[i]]$class,
'character' = as.character,
'numeric' = as.numeric,
'datetime' = as.POSIXct,
'boolean' = as.character)
empty_df[[i]] <- cast_function(empty_df[[i]])
}
我该如何执行此操作?有没有更好的办法?
提前致谢
我认为此代码段包含您可能需要的所有元素:
lst <- list(
x = list("character", letters[1:5]),
y = list("numeric", as.double(1:5)),
w = list("boolean", as.character(as.integer(c(
T, F, F
)))),
z = list("datetime", Sys.time())
)
my_classes <- unlist(lapply(lst, function(x) x[1]))
mapping <- list(
character = character(),
numeric = numeric(),
datetime = structure(double(), class = c("POSIXct", "POSIXt")),
boolean = character()
)
do.call(tibble::tibble, args = mapping[my_classes])
#> # A tibble: 0 × 4
#> # … with 4 variables: character <chr>, numeric <dbl>, boolean <chr>,
#> # datetime <dttm>
根据植物的回答,我得到了这个解决方案:
my_list <- list(
name_1 = list( class = "character", stuff = 11 ),
name_2 = list( class = "boolean", stuff = 22 ),
name_3 = list( class = "numeric", stuff = 22 ),
name_rr = list( class = "character", stuff = 54 ),
name_56 = list( class = "datetime", stuff = 89 ),
name_zzz = list( class = "boolean", stuff = 134 )
)
my_classes <- list()
for (i in my_list) {
my_classes <- c(my_classes, i$class)
}
mapping <- list(
character = character(),
numeric = numeric(),
datetime = structure(double(), class = c("POSIXct", "POSIXt")),
boolean = character()
)
my_args <- mapping[unlist(my_classes)]
names(my_args) <- names(my_list)
do.call(tibble::tibble, args = my_args)
# my_function(my_list_1)
# A tibble: 0 x 6
# ... with 6 variables: character <chr>, boolean <chr>, numeric <dbl>, character <chr>, datetime <dttm>, boolean <chr>
我正在尝试创建一个具有特定列名称和列类型的空数据框。我拥有的是一个接收具有以下结构的列表的函数:
list$
$name_1$
$class
$more_stuff
$name_2$
$class
$more_stuff
...
因此,我创建了一个空数据框:
df <- data.frame(matrix(ncol = length(names(my_list)), nrow = 0))
colnames(df) <- names(my_list)
# set column types
列表中的每一项都有一个包含数据类型的 'class' 属性。这些可以是:“字符”、“数字”、“日期时间”、“布尔值”,它们必须转换为:
"character" -> character
"numeric" -> numeric
"datetime" -> datetime<UTC>
"boolean" -> character
因为这个数据框将被连接到另一个具有这些列的数据框。
我试过类似的方法,但日期时间列不正确:
for (i in c(1:length(my_list))) {
cast_function = switch(my_list[[i]]$class,
'character' = as.character,
'numeric' = as.numeric,
'datetime' = as.POSIXct,
'boolean' = as.character)
empty_df[[i]] <- cast_function(empty_df[[i]])
}
我该如何执行此操作?有没有更好的办法?
提前致谢
我认为此代码段包含您可能需要的所有元素:
lst <- list(
x = list("character", letters[1:5]),
y = list("numeric", as.double(1:5)),
w = list("boolean", as.character(as.integer(c(
T, F, F
)))),
z = list("datetime", Sys.time())
)
my_classes <- unlist(lapply(lst, function(x) x[1]))
mapping <- list(
character = character(),
numeric = numeric(),
datetime = structure(double(), class = c("POSIXct", "POSIXt")),
boolean = character()
)
do.call(tibble::tibble, args = mapping[my_classes])
#> # A tibble: 0 × 4
#> # … with 4 variables: character <chr>, numeric <dbl>, boolean <chr>,
#> # datetime <dttm>
根据植物的回答,我得到了这个解决方案:
my_list <- list(
name_1 = list( class = "character", stuff = 11 ),
name_2 = list( class = "boolean", stuff = 22 ),
name_3 = list( class = "numeric", stuff = 22 ),
name_rr = list( class = "character", stuff = 54 ),
name_56 = list( class = "datetime", stuff = 89 ),
name_zzz = list( class = "boolean", stuff = 134 )
)
my_classes <- list()
for (i in my_list) {
my_classes <- c(my_classes, i$class)
}
mapping <- list(
character = character(),
numeric = numeric(),
datetime = structure(double(), class = c("POSIXct", "POSIXt")),
boolean = character()
)
my_args <- mapping[unlist(my_classes)]
names(my_args) <- names(my_list)
do.call(tibble::tibble, args = my_args)
# my_function(my_list_1)
# A tibble: 0 x 6
# ... with 6 variables: character <chr>, boolean <chr>, numeric <dbl>, character <chr>, datetime <dttm>, boolean <chr>