Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 将字符向量列子集为多列_R_Dplyr_Text Mining_Tidyr_Data Manipulation - Fatal编程技术网

R 将字符向量列子集为多列

R 将字符向量列子集为多列,r,dplyr,text-mining,tidyr,data-manipulation,R,Dplyr,Text Mining,Tidyr,Data Manipulation,我有以下几点: colours = tribble( ~all, c('blue','green', 'red', 'pink', 'yellow', 'gold', 'orange', 'ivory', 'brown', 'beige'), c('green', 'red', 'pink', 'orange', 'ivory', 'beige') ) 我想根据颜色系列将颜色分为多列:Cool、Warm、Neutral,每个系列一列 我可以使用mutate和map和stru子集来实

我有以下几点:

colours = tribble(
  ~all,
  c('blue','green', 'red', 'pink', 'yellow', 'gold', 'orange', 'ivory', 'brown', 'beige'),
  c('green', 'red', 'pink', 'orange', 'ivory', 'beige')
)
我想根据颜色系列将颜色分为多列:
Cool
Warm
Neutral
,每个系列一列

我可以使用
mutate
map
stru子集来实现这一点:

colours %>%
  mutate(
    'Cool' = map(all, ~str_subset(., '^(blue|green)$')), 
    'Warm' = map(all, ~str_subset(., '^(red|pink|yellow|gold|orange)$')),
    'Neutral' = map(all, ~str_subset(., '^(ivory|brown|beige)$'))
  )

# A tibble: 2 x 4
  all        Cool      Warm      Neutral  
  <list>     <list>    <list>    <list>   
1 <chr [10]> <chr [2]> <chr [5]> <chr [3]>
2 <chr [6]>  <chr [1]> <chr [3]> <chr [2]>

我猜这是不正确的,因为OR语句匹配每个组中的单个单词,而不是将字符串分成三个子字符串,其中包含每个组的所有匹配单词

我非常确信
extract
不起作用,但它使用了正确的正则表达式。它实际上并不比您的第一个解决方案更“简洁”,但我认为它可能是尽可能简洁的。(如果要缩短时间,请考虑将颜色折叠为两个元素的字符向量,而不是带有列表列的数据帧。)

正则表达式模式的问题在于使用
|
。您希望以单词集合为目标,而不是“x、y或z”,这是您的模式所做的,也是为什么每行只获得一个匹配项的原因。要创建可能匹配项的集合,请使用
[]
。对于“零或更多”匹配,包括
*
。使用上面的示例数据:

库(tidyverse)
颜色%>%
突变(all=map(all,str_c,collapse=”“)%>%
提取物(全部,c(“冷”、“温”、“中性”),
“([蓝绿色]*)([红-粉-黄-金-橙]*)([象牙棕色-米色]*)”,
remove=F#包括'all'列。
)
####输出####
#一个tibble:2x4
全冷暖中性
1蓝绿色红色粉色黄金橙色象牙棕色米色
2绿-红-粉红-橙色-象牙色-米色
主要的警告是,颜色类别需要按正确的顺序排列,即字符串必须按
cool
→ <代码>预热
→ <代码>空档。如果它们是随机的,就不会起作用。事实上,我认为如果颜色词是随机的,
extract
将不再有效,因为无法提取单个词,然后将它们连接起来。如果列表列对您很重要,您也会丢失列表列

如果不能保证顺序,或者可能缺少一些类别词,那么您可以执行以下操作。使用类别词的随机样本(请注意,我会删除列表列,以便您可以看到发生了什么):

col\u rand%
mutate(all=map(all,str_c,collapse=”“)%>%unlist()
####输出####
#一个tibble:2x1
全部的
1蓝黄红米色粉
2象牙粉米色橙
并具有以下模式:

patts%
map_dfr(函数(x){str_extract_all(x,patts)%>%
map(函数(x)ifelse(长度(x)==0,
不,,
str_c(x,collapse=”“)
)
) %>% 
bind_cols()})%>%
设置列名称(名称(patts))%>%bind列名称(列名称)
####输出####
#一个tibble:2x4
全冷暖中性
1蓝黄红米色粉蓝黄红米色粉
2象牙粉米色橙色NA粉橙象牙色米色
请注意,
magrittr
库是为
set\u colnames
加载的。如果在
tidyverse
/
tidyr
之后加载
magrittr
,则需要使用上面的
tidyr::extract()
,因为两个库都有
extract
函数


在我看来,数据框列不是按颜色族保存颜色列表的最合适的数据结构,因为每个族中的颜色数量是可变的。根据“整洁数据”原则,每种颜色应该有一行。我会(1)创建一个CSV查找表,将颜色与族配对(2)将表读入R(3)将颜色数据与查找表连接起来。谢谢@qdread,但我无法将其整理成长格式,因为该表仅用于post中描述的格式(每个颜色族的一列)中的表示/显示目的。我觉得只要
extract()
就可以完成,但我对正则表达式的理解很糟糕。如果列表列只能看到每个向量的计数,而不能看到颜色本身,“呈现/显示”如何更好地服务于列表列呢?@gersht,因为当使用
DT::datatable()之类的东西呈现表格时,颜色是可见的
-
库(DT);datatable(颜色)
。感谢您提供这些解决方案,感谢您花时间在@gersht上对它们进行了透彻的解释!在整个实际数据集中,单词的顺序保持不变,但我非常喜欢第二种解决方案,因为它更通用。我对
purr
很陌生,所以你的帖子真的帮了我大忙。
colours %>% 
  mutate(all = map(all, ~paste(., collapse = ' '))) %>% 
  extract(all, into = c('Cool', 'Warm', 'Neutral'), 
          regex = '(blue|green)|(red|pink|yellow|gold|orange)|(ivory|brown|beige)')