gpt4 book ai didi

在 R 中重新编码分号分隔的列表

转载 作者:行者123 更新时间:2023-12-03 17:50:18 25 4
gpt4 key购买 nike

我是 R 的新手,正在努力解决这个问题。我有一列包含逗号分隔的事物列表的字符向量的数据名望。我想保留该列,但为每个值为 0(不在列表中)或 1(在列表中)的项目添加一列。

这是我正在尝试的内容:

library("tidyverse")

colors <- c("red;blue", "red;green")
df <- data.frame(colors, stringsAsFactors = FALSE)
df %>%
mutate(green = case_when("green" %in% strsplit(colors,";")[[1]] ~ 1,
TRUE ~ 0))

我得到的结果是:
     colors green
1 red;blue 0
2 red;green 0

我预计第二行中“绿色”的值为 1。

为了尝试调试这个我试过这个:
> strsplit("red;green", ";")
[[1]]
[1] "red" "green"

> "green" %in% strsplit("red;green",";")[[1]]
[1] TRUE

# and the negative case
> "green" %in% strsplit("red;blue",";")[[1]]
[1] FALSE

我错过了什么?

最佳答案

data.table解决方案,您可以使用 tstrsplit :

library(data.table)

df <- data.table::data.table(
color = c("red;blue", "red;green")
)

df[, c("col1","col2") := tstrsplit(color, ";", fixed = TRUE)]
df[, "green" := (col2 == "green")]

df

# color col1 col2 green
# 1: red;blue red blue FALSE
# 2: red;green red green TRUE

如果您不熟悉 data.table按引用更新运算符 := , data.table小插图是一个很好的起点。选项 fixed = TRUEtstrsplit假设您的逗号分隔列表中始终具有相同数量的元素。

我认为有一种解决方案更适合您拥有多个值的情况。重复使用 lapply ,您可以将一系列列添加到您的 data.table
df 开始:

df <- data.table::data.table(
color = c("red;blue", "red;green")
)

调用 lapplygrepl为了扫描相关颜色,我们通过引用我们的对象来更新(请注意,您可以使用三种以上的颜色):

lapply(c("red","green","blue"), function(x){
df[grepl(x, color), c(as.character(x)) := TRUE]
})
#[[1]]

#[[2]]
# color red green blue
#1: red;blue TRUE NA TRUE
#2: red;green TRUE TRUE NA

#[[3]]
# color red green blue
#1: red;blue TRUE NA TRUE
#2: red;green TRUE TRUE NA

无需重新分配数据帧。它已通过引用更新。只有 df 的最后一个插槽我们感兴趣。最后,通过选择这个并设置 NAsFALSE :

df <- df[[length(df)]]
df[is.na(df)] <- FALSE

df
# color red green blue
# 1: red;blue TRUE FALSE TRUE
# 2: red;green TRUE TRUE FALSE

希望能帮助到你

关于在 R 中重新编码分号分隔的列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60893595/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com