[英]R / dyplr: Transforming two rows into two columns
我在 R 中有一个数据框,如下所示:
Word Base Number Type
- - - -
shoe shoe 4834 singular
shoes shoe 49955 plural
toy toy 75465 singular
toys toy 23556 plural
key key 39485 singular
keys key 6546 plural
jazz jazz 58765 plural
我想改变它,使它看起来像这样:
Word_Sg Word_Pl Base Num_Singular Num_Plural
-- -- -- -- --
shoe shoes shoe 4834 49955
toy toys toy 75465 23556
key keys key 39485 6546
NA jazz jazz NA 58765
因此,与其有两行单数和复数的值,我想要两列,一列是单数,另一列是复数。
我已经使用dplyr::summarize
尝试了一些东西,但到目前为止,没有任何成功。 这是我到目前为止想出的代码:
dataframe1 <- dataframe %>%
mutate(Num_Singular = case_when(Type == "singular" ~ Number)) %>%
mutate(Num_Plural = case_when(Type == "plural" ~ Number)) %>%
dplyr::select(Word, Base, Num_Singular, Num_Plural) %>%
group_by(Base) %>%
dplyr::summarize(Num_Singular = paste(na.omit(Num_Singular)),
Num_Plural = paste(na.omit(Num_Plural))
但是,它给了我这个错误:
Error in summarise_impl(.data, dots) :
Column `Num_Singular` must be length 1 (a summary value), not 2)
我认为问题可能在于有些行不一定有单数和复数,但只有其中之一(例如“爵士”)。 大多数行都有。
那么我怎样才能在 R 或 dplyr 中做到这一点呢?
如果你先看前几列:
select(dat, Base, Word, Type)[1:2,]
# Base Word Type
# 1 shoe shoe singular
# 2 shoe shoes plural
从这里开始,考虑它只是将其扩展为单数/复数列,有效地从“高”到“宽”。 (如果Type
有两个以上的类别会更明显。)
select(dat, Base, Word, Type) %>%
spread(Type, Word) %>%
rename(Word_Pl=plural, Word_Sg=singular)
# Base Word_Pl Word_Sg
# 1 jazz jazz <NA>
# 2 key keys key
# 3 shoe shoes shoe
# 4 toy toys toy
您也可以轻松地为Number
重复此操作。 从那里开始,只需根据键列Base
合并/加入它们即可:
full_join(
select(dat, Base, Word, Type) %>%
spread(Type, Word) %>%
rename(Word_Pl=plural, Word_Sg=singular),
select(dat, Base, Number, Type) %>%
spread(Type, Number) %>%
rename(Num_Pl=plural, Num_Sg=singular),
by = "Base"
)
# Base Word_Pl Word_Sg Num_Pl Num_Sg
# 1 jazz jazz <NA> 58765 NA
# 2 key keys key 6546 39485
# 3 shoe shoes shoe 49955 4834
# 4 toy toys toy 23556 75465
耗材数据:
library(dplyr)
library(tidyr)
dat <- read.table(text='Word Base Number Type
shoe shoe 4834 singular
shoes shoe 49955 plural
toy toy 75465 singular
toys toy 23556 plural
key key 39485 singular
keys key 6546 plural
jazz jazz 58765 plural', header=TRUE, stringsAsFactors=FALSE)
tidyr
的新pivot_wider()
函数使这变得简单......
library(dplyr)
library(tidyr)
dat <- read.table(header = T, stringsAsFactors = F, text='
Word Base Number Type
shoe shoe 4834 singular
shoes shoe 49955 plural
toy toy 75465 singular
toys toy 23556 plural
key key 39485 singular
keys key 6546 plural
jazz jazz 58765 plural')
dat %>%
pivot_wider(id_cols = Base, names_from = Type, values_from = c(Word, Number))
# # A tibble: 4 x 5
# Base Word_singular Word_plural Number_singular Number_plural
# <chr> <chr> <chr> <int> <int>
# 1 shoe shoe shoes 4834 49955
# 2 toy toy toys 75465 23556
# 3 key key keys 39485 6546
# 4 jazz NA jazz NA 58765
核心思想是通过它的类型以及它是一个单词还是一个数字来识别每个数据点......然后很容易传播到你想要的格式。 (我不会费心重命名变量或专门对它们进行排序以匹配您的预期输出,因为这很容易做到,而不是这里的问题的一部分)
library(dplyr)
library(tidyr)
dat <- read.table(header = T, stringsAsFactors = F, text='
Word Base Number Type
shoe shoe 4834 singular
shoes shoe 49955 plural
toy toy 75465 singular
toys toy 23556 plural
key key 39485 singular
keys key 6546 plural
jazz jazz 58765 plural')
dat %>%
gather(variable, value, Word, Number) %>%
unite(Type, variable, Type) %>%
spread(Type, value, convert = T) %>%
as_tibble()
# # A tibble: 4 x 5
# Base Number_plural Number_singular Word_plural Word_singular
# <chr> <int> <int> <chr> <chr>
# 1 jazz 58765 NA jazz NA
# 2 key 6546 39485 keys key
# 3 shoe 49955 4834 shoes shoe
# 4 toy 23556 75465 toys toy
您可以通过Base
加入数据的plural
和singular
子集,然后删除Type
列并重新排序其他列......
full_join(filter(dat, Type == "plural"),
filter(dat, Type == "singular"),
by = "Base",
suffix = c("_Pl", "_Sg")) %>%
select(Word_Sg, Word_Pl, Base, Number_Sg, Number_Pl)
# Word_Sg Word_Pl Base Number_Sg Number_Pl
# 1 shoe shoes shoe 4834 49955
# 2 toy toys toy 75465 23556
# 3 key keys key 39485 6546
# 4 <NA> jazz jazz NA 58765
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.