从不同的列中提取字符串并整理 R 中的数据
Extracting strings from different columns and tidying data in R
我正在尝试从数据集中提取电影类型的字符串。数据采用以下格式,其中流派类型在数据集中按不同的方式随机分布 reviewers.Luckily 数据集中只有 4 种流派类型(喜剧、动作、恐怖、科幻),但也有重复。所以我需要从数据集中提取这些字符串。
id movie v1 v2 v3 v4 v5 v6
1 LTR comedy highbudget action comedy jj horror
2 MI newmovie fiction scifi funny xx jhee
我期待以下形式的输出。
id movie genretype1 genretype2 genretype3 genretype4
1 LTR comedy action comedy horror
2 MI scifi --- --- ---
有什么建议吗?
这就是我的做法 - 使用列表更有意义,而不是 data.frame
> types = c("comedy", "action", "horror", "scifi")
> List = apply(df, 1, function(x) types[types %in% x[-c(1, 2)]])
> names(List) <- df$movie
> List
$LTR
[1] "comedy" "action" "horror"
$MI
[1] "scifi"
或者,此解决方案可为您提供整洁的 data.frame:
> Matrix = t(apply(df, 1, function(x) types %in% x[-c(1, 2)]))
> colnames(Matrix) = types
> cbind(df[,1:2], Matrix)
id movie comedy action horror scifi
1 1 LTR TRUE TRUE TRUE FALSE
2 2 MI FALSE FALSE FALSE TRUE
我们可以 match
'types' 的每一行 'df1' 排除第一个两个标识符列。 'lst1'中的list
个元素的长度可能不一样。我们通过将 NA
值填充到长度小于最大长度元素的元素,rbind
列表元素并创建新的 data.frame
.
来使长度相等
types <- c("comedy", "action", "horror", "scifi")
lst1 <- apply(df1[-(1:2)], 1, function(x)
types[match(x, types, nomatch=0)])
res <- data.frame(df1[1:2], do.call(rbind, lapply(lst1,
'length<-', max(lengths(lst1)))))
res
# id movie X1 X2 X3 X4
#1 1 LTR comedy action comedy horror
#2 2 MI scifi <NA> <NA> <NA>
注意:如果需要,我们可以更改列名。
colnames(res)[-(1:2)] <- paste0('genretype', 1:4)
我正在尝试从数据集中提取电影类型的字符串。数据采用以下格式,其中流派类型在数据集中按不同的方式随机分布 reviewers.Luckily 数据集中只有 4 种流派类型(喜剧、动作、恐怖、科幻),但也有重复。所以我需要从数据集中提取这些字符串。
id movie v1 v2 v3 v4 v5 v6
1 LTR comedy highbudget action comedy jj horror
2 MI newmovie fiction scifi funny xx jhee
我期待以下形式的输出。
id movie genretype1 genretype2 genretype3 genretype4
1 LTR comedy action comedy horror
2 MI scifi --- --- ---
有什么建议吗?
这就是我的做法 - 使用列表更有意义,而不是 data.frame
> types = c("comedy", "action", "horror", "scifi")
> List = apply(df, 1, function(x) types[types %in% x[-c(1, 2)]])
> names(List) <- df$movie
> List
$LTR
[1] "comedy" "action" "horror"
$MI
[1] "scifi"
或者,此解决方案可为您提供整洁的 data.frame:
> Matrix = t(apply(df, 1, function(x) types %in% x[-c(1, 2)]))
> colnames(Matrix) = types
> cbind(df[,1:2], Matrix)
id movie comedy action horror scifi
1 1 LTR TRUE TRUE TRUE FALSE
2 2 MI FALSE FALSE FALSE TRUE
我们可以 match
'types' 的每一行 'df1' 排除第一个两个标识符列。 'lst1'中的list
个元素的长度可能不一样。我们通过将 NA
值填充到长度小于最大长度元素的元素,rbind
列表元素并创建新的 data.frame
.
types <- c("comedy", "action", "horror", "scifi")
lst1 <- apply(df1[-(1:2)], 1, function(x)
types[match(x, types, nomatch=0)])
res <- data.frame(df1[1:2], do.call(rbind, lapply(lst1,
'length<-', max(lengths(lst1)))))
res
# id movie X1 X2 X3 X4
#1 1 LTR comedy action comedy horror
#2 2 MI scifi <NA> <NA> <NA>
注意:如果需要,我们可以更改列名。
colnames(res)[-(1:2)] <- paste0('genretype', 1:4)