将一列拆分为多个 R 并在为真时给出逻辑值
Splitting one Column to Multiple R and Giving logical value if true
我正在尝试将数据框中的一列拆分为多列,这些列将原始列中的值作为新列名保存。然后,如果原始列中出现了相应的列,则在新列中给它一个 1,如果不匹配则为 0。我意识到这不是最好的解释方式,例如:
df <- data.frame(subject = c(1:4), Location = c('A', 'A/B', 'B/C/D', 'A/B/C/D'))
# subject Location
# 1 1 A
# 2 2 A/B
# 3 3 B/C/D
# 4 4 A/B/C/D
并希望将其扩展为宽格式,例如带有 1 和 0(或 T 和 F)的内容:
# subject A B C D
# 1 1 1 0 0 0
# 2 2 1 1 0 0
# 3 3 0 1 1 1
# 4 4 1 1 1 1
我研究了 tidyr
和 separate
函数以及 reshape2
和 cast
函数,但似乎对给出逻辑值感到困惑。对此问题的任何帮助将不胜感激。谢谢。
您可以采用以下循序渐进的方法。
## get the unique values after splitting
u <- unique(unlist(strsplit(as.character(df$Location), "/")))
## compare 'u' with 'Location'
m <- vapply(u, grepl, logical(length(u)), x = df$Location)
## coerce to integer representation
m[] <- as.integer(m)
## bind 'm' to 'subject'
cbind(df["subject"], m)
# subject A B C D
# 1 1 1 0 0 0
# 2 2 1 1 0 0
# 3 3 0 1 1 1
# 4 4 1 1 1 1
您可以尝试 cSplit_e
软件包 splitstackshape
:
library(splitstackshape)
cSplit_e(data = df, split.col = "Location", sep = "/",
type = "character", drop = TRUE, fill = 0)
# subject Location_A Location_B Location_C Location_D
# 1 1 1 0 0 0
# 2 2 1 1 0 0
# 3 3 0 1 1 1
# 4 4 1 1 1 1
我正在尝试将数据框中的一列拆分为多列,这些列将原始列中的值作为新列名保存。然后,如果原始列中出现了相应的列,则在新列中给它一个 1,如果不匹配则为 0。我意识到这不是最好的解释方式,例如:
df <- data.frame(subject = c(1:4), Location = c('A', 'A/B', 'B/C/D', 'A/B/C/D'))
# subject Location
# 1 1 A
# 2 2 A/B
# 3 3 B/C/D
# 4 4 A/B/C/D
并希望将其扩展为宽格式,例如带有 1 和 0(或 T 和 F)的内容:
# subject A B C D
# 1 1 1 0 0 0
# 2 2 1 1 0 0
# 3 3 0 1 1 1
# 4 4 1 1 1 1
我研究了 tidyr
和 separate
函数以及 reshape2
和 cast
函数,但似乎对给出逻辑值感到困惑。对此问题的任何帮助将不胜感激。谢谢。
您可以采用以下循序渐进的方法。
## get the unique values after splitting
u <- unique(unlist(strsplit(as.character(df$Location), "/")))
## compare 'u' with 'Location'
m <- vapply(u, grepl, logical(length(u)), x = df$Location)
## coerce to integer representation
m[] <- as.integer(m)
## bind 'm' to 'subject'
cbind(df["subject"], m)
# subject A B C D
# 1 1 1 0 0 0
# 2 2 1 1 0 0
# 3 3 0 1 1 1
# 4 4 1 1 1 1
您可以尝试 cSplit_e
软件包 splitstackshape
:
library(splitstackshape)
cSplit_e(data = df, split.col = "Location", sep = "/",
type = "character", drop = TRUE, fill = 0)
# subject Location_A Location_B Location_C Location_D
# 1 1 1 0 0 0
# 2 2 1 1 0 0
# 3 3 0 1 1 1
# 4 4 1 1 1 1