我正在尝试在我的数据集中创建一个新列。到目前为止,我已经将一个JSON文件导入到R中,其中包含一个充满不同单词的列("紫色","红色","蓝色"等)观察有一些这些词的组合。我的目标是创建一个新列,其中包含单词的标题(" purple"," red"," blue"等)。我希望该列具有True或Falses,具体取决于观察结果是否显示该颜色。我尝试使用子集函数以及手动执行此操作,但是有超过300种不同的观察结果,这使得非常不方便。我非常感谢任何帮助!
例如:
Observations Color
1 Blue
2 Red, Blue
3 Blue, Green
4 Purple
5 Yellow, Orange
现在我想要
Observations Color Red Yellow Orange Blue
1 Blue False False False True
2 Red, Blue True False False True
等
这是我在这个网站上的第一个问题所以如果有任何问题我会道歉。
答案 0 :(得分:2)
您可以简单地遍历要创建的列名称,并使用grepl
查找Color
列中是否存在这些名称:
dat <- read.table(text="Observations Color
1 Blue
2 Red,Blue
3 Blue,Green
4 Purple
5 Yellow,Orange", header=T, stringsAsFactors=F)
# I removed the space after the commas to facilitate the data.frame creation.
cols <- c("Red", "Yellow", "Orange", "Blue")
for (i in cols) dat[[i]] <- grepl(i, dat$Color)
结果:
> dat
Observations Color Red Yellow Orange Blue
1 1 Blue FALSE FALSE FALSE TRUE
2 2 Red,Blue TRUE FALSE FALSE TRUE
3 3 Blue,Green FALSE FALSE FALSE TRUE
4 4 Purple FALSE FALSE FALSE FALSE
5 5 Yellow,Orange FALSE TRUE TRUE FALSE
如果你想要所有颜色的列,创建矢量的更好方法是罗伯特在评论中提出的:
cols <- unique(unlist(strsplit(dat$Color, ",")))
#You might have to change from "," to ", " if you have white spaces after the commas
#or even ",\\s?" if they aren't always there.
新结果将是:
Observations Color Red Yellow Orange Blue Green Purple
1 1 Blue FALSE FALSE FALSE TRUE FALSE FALSE
2 2 Red,Blue TRUE FALSE FALSE TRUE FALSE FALSE
3 3 Blue,Green FALSE FALSE FALSE TRUE TRUE FALSE
4 4 Purple FALSE FALSE FALSE FALSE FALSE TRUE
5 5 Yellow,Orange FALSE TRUE TRUE FALSE FALSE FALSE
答案 1 :(得分:0)
尝试这样的事情:
example <- data.frame(colors=c("A,B", "A", "B", "F", "C", "C,G", "C", "D", "E", "F"),stringsAsFactors = F)
cols <- sort(unique(unlist(strsplit(example$colors, ",", fixed = TRUE))))
dummies= sapply(cols,function(co)grepl(co, example$colors))
A B C D E F G
[1,] TRUE TRUE FALSE FALSE FALSE FALSE FALSE
[2,] TRUE FALSE FALSE FALSE FALSE FALSE FALSE
[3,] FALSE TRUE FALSE FALSE FALSE FALSE FALSE
[4,] FALSE FALSE FALSE FALSE FALSE TRUE FALSE
[5,] FALSE FALSE TRUE FALSE FALSE FALSE FALSE
[6,] FALSE FALSE TRUE FALSE FALSE FALSE TRUE
[7,] FALSE FALSE TRUE FALSE FALSE FALSE FALSE
[8,] FALSE FALSE FALSE TRUE FALSE FALSE FALSE
[9,] FALSE FALSE FALSE FALSE TRUE FALSE FALSE
[10,] FALSE FALSE FALSE FALSE FALSE TRUE FALSE
答案 2 :(得分:0)
基础R的解释比使用dplyr
更简单,但感兴趣的是dplyr
解决方案:
cols <- unique(unlist(strsplit(dat$Color, ",", fixed = TRUE)))
dat %>% mutate_(.dots = sapply(cols, function(col) interp(~grepl(col, Color), col = col)))
这是使用plyr
和magrittr
的方式:
cols %>%
laply(grepl, dat$Color) %>%
t %>%
data.frame %>%
setNames(cols) %>%
cbind(dat, .)
另一个:
dat %>% adply(1, . %$%
Color %>%
strsplit(",") %>%
extract2(1) %>%
factor(levels = cols) %>%
table %>%
is_greater_than(0))
这利用了magrittr
允许您创建匿名函数链的事实。