R-将多个值作为单个变量中的一个字符串处理
在R-将多个值作为单个变量中的一个字符串处理,r,R,在data.frame中,我有一个文本语言的分类变量。但是,虽然大多数文本只有一种语言,但有些文本有多种语言。在我的数据中,它们出现在同一列中,除以comas: text = c("Text1", "Text2", "Text3") lang = c("fr", "en", "fr,en") d = data.frame(text, lang) 视觉上: text lang 1 Text1 fr 2 Text2 en 3 Text3 fr,en 我想绘制每种语言的文本数量
data.frame
中,我有一个文本语言的分类变量。但是,虽然大多数文本只有一种语言,但有些文本有多种语言。在我的数据中,它们出现在同一列中,除以comas:
text = c("Text1", "Text2", "Text3")
lang = c("fr", "en", "fr,en")
d = data.frame(text, lang)
视觉上:
text lang
1 Text1 fr
2 Text2 en
3 Text3 fr,en
我想绘制每种语言的文本数量,文本3在fr
和en
中都被计算
我找到了如何拆分,包括:
d$lang <- strsplit(d$lang, ",")
我做得对吗?有更好的方法吗?考虑使用
tidyr::separate()
进行拆分,使用tidyr::gather()
使其更长
library(magrittr)
ceiling <- 2L #The max language count of any single text
language_positions <- paste0("language_", seq_len(ceiling))
d %>%
tidyr::separate("lang", language_positions, sep=",", extra="merge") %>%
tidyr::gather_("ordinal", "language_name", language_positions) %>%
dplyr::filter(!is.na(language_name))
如果你想把它分成两个小步骤。separate()
> d_wide <- d %>%
+ tidyr::separate_("lang", language_positions, sep=",", extra="merge")
> d_wide
text language_1 language_2
1 Text1 fr <NA>
2 Text2 en <NA>
3 Text3 fr en
出于其他原因,我建议在定义d
时添加,stringsAsFactors=F
,但tidyr
的单独函数似乎并不介意。qplot调用可以保持不变:qplot(语言名称,数据长度)
您可以尝试:
library(splitstackshape)
dl <- cSplit(d, "lang", ",", "long")
qplot(lang, data = dl)
库(splitstackshape)
dl如果不遵循user20650评论中的建议,您可能无法不重新构造数据而逃脱惩罚,并且您如何做到这一点不能忽视数据的任意存储方式。例如,如果您知道语言由两个不同的字符串表示(因此,例如,任何非“fr”的语言表示都不包含序列“fr”),则可以基于对逗号分隔表示中代码的搜索创建新的布尔列。例如:
# Data
text = c("Text1", "Text2", "Text3", "Text4", "Text5")
lang = c("fr", "en", "fr,en", "sp,fr", "sp,fr,en")
d = data.frame(text, lang, stringsAsFactors = FALSE)
# Get a vector of the languages that exist
languages <- unique(unlist(strsplit(d$lang, ",")))
# Create a new column for each language
for (language in languages) d[[language]] <- grepl(language, d$lang)
# An example bar-plot
barplot(colSums(d[, -c(1, 2)]))
#数据
text=c(“Text1”、“Text2”、“Text3”、“Text4”、“Text5”)
lang=c(“fr”、“en”、“fr、en”、“sp、fr”、“sp、fr”、“sp、fr、en”)
d=data.frame(text、lang、stringsAsFactors=FALSE)
#获取现有语言的向量
语言不能像那样将列表传递给qplot
,其默认绘图是散点图。尝试qplot(x=unlist(strsplit(as.character(d$lang),“,”),geom=“bar”)
或非ggplot
答案。barplot(表(unlist(strsplit)(as.character(d$lang),“,”)
。是否有一种方法可以在维护其他数据列的同时使用取消列表
?在上面的例子中,假设我还有第三列,我想与lang保持一致,有办法吗?也许通过复制观察结果?非常感谢。我花了更多的时间才完全理解你的答案(因为我对R的理解非常基本),但现在我明白了,这正是我所需要的@Richard Ambler这是非常非常有用的代码,非常棒!!!然后,我有一个关于线路的问题;对于(语言中的语言)d[[语言]]现在我明白了!(在阅读了splitstackshape
文档:-)该软件包非常完美:非常感谢!事实上,我需要的是:cSplit(d,“lang”)
,这与cSplit(d,“lang”、“,”和“wide”)
d_long <- d_wide %>%
tidyr::gather_("ordinal", "language_name", language_positions) %>%
dplyr::filter(!is.na(language_name))
library(splitstackshape)
dl <- cSplit(d, "lang", ",", "long")
qplot(lang, data = dl)
# Data
text = c("Text1", "Text2", "Text3", "Text4", "Text5")
lang = c("fr", "en", "fr,en", "sp,fr", "sp,fr,en")
d = data.frame(text, lang, stringsAsFactors = FALSE)
# Get a vector of the languages that exist
languages <- unique(unlist(strsplit(d$lang, ",")))
# Create a new column for each language
for (language in languages) d[[language]] <- grepl(language, d$lang)
# An example bar-plot
barplot(colSums(d[, -c(1, 2)]))