取消列出数据框列,不会丢失来自其他列的信息

时间:2015-11-18 10:40:22

标签: r list dataframe strsplit

我找到了post,这与我的问题非常相似。 我有一个带有关键字列表的data.frame,在一个coloumn中用分号分隔,在另一列中用year分隔。我想取消关键字,而不会丢失有关年份的信息。

我可以将关键字与strsplit和unlist

分开
keywords <- unlist(strsplit(df$keywords,";"))
l1 <- sapply(df$keywords, length)
Year <- rep(df$Year, l1)
length(Year)
length(keywords)
dfkeywords=data.frame(Year=Year, Keywords=keywords, stringsAsFactors = F)

但我无法生成与关键字矢量长度相同的年份矢量。

我如何以聪明的方式做到这一点?

最佳

皮特

2 个答案:

答案 0 :(得分:0)

在取消列出拆分关键字之前计算长度。所以拆分关键字

keywords = strsplit(df$keywords,";")

查找每条记录中的长度(关键字数量)

lens = lengths(keywords)

创建data.frame

data.frame(Year=rep(df$Year, lens), Keywords=unlist(keywords),
           stringsAsFactors=FALSE)

答案 1 :(得分:0)

假设你有类似的东西:

df <- data.frame(keywords = c("some;text", "some;other;text", "even;more;text;here"),
                 Year = c(2025, 2026, 2099))
df
#              keywords Year
# 1           some;text 2025
# 2     some;other;text 2026
# 3 even;more;text;here 2099

然后我建议您考虑使用我的&#34; splitstackshape&#34;中的cSplit。封装

library(splitstackshape)
cSplit(df, "keywords", ";", "long")
#    keywords Year
# 1:     some 2025
# 2:     text 2025
# 3:     some 2026
# 4:    other 2026
# 5:     text 2026
# 6:     even 2099
# 7:     more 2099
# 8:     text 2099
# 9:     here 2099

其他需要考虑的方法是:

&#34; dplyr&#34; +&#34; tidyr&#34;

library(dplyr)
library(tidyr)
df %>%
  mutate(keywords = strsplit(as.character(keywords), ";")) %>%
  unnest(keywords)

&#34; data.table&#34;

library(data.table)
as.data.table(df)[, list(keywords = unlist(strsplit(as.character(keywords), ";"))), 
                  by = Year]