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)]))