[英]R / dyplr: Transforming two rows into two columns
I have a dataframe in R that looks like this:我在 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
I would like to transform it so that it looks like this:我想改变它,使它看起来像这样:
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
So rather than having two rows for the values for singular & plural, I want to have two colums, one with the number for singular, and one with the number for plural.因此,与其有两行单数和复数的值,我想要两列,一列是单数,另一列是复数。
I've tried a few things using dplyr::summarize
, but so far, without any success.我已经使用
dplyr::summarize
尝试了一些东西,但到目前为止,没有任何成功。 Here is the code that I've come up with so far:这是我到目前为止想出的代码:
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))
However, it gives me this error:但是,它给了我这个错误:
Error in summarise_impl(.data, dots) :
Column `Num_Singular` must be length 1 (a summary value), not 2)
I think the problem might be that there are rows that don't necessarily have singular AND plural, but only either (eg "jazz").我认为问题可能在于有些行不一定有单数和复数,但只有其中之一(例如“爵士”)。 Most rows have both though.
大多数行都有。
So how can I do this in R or dplyr?那么我怎样才能在 R 或 dplyr 中做到这一点呢?
If you first look at the first few columns::如果你先看前几列:
select(dat, Base, Word, Type)[1:2,]
# Base Word Type
# 1 shoe shoe singular
# 2 shoe shoes plural
From here, consider it just spreading it into a singular/plural columns, effectively going from "tall" to "wide".从这里开始,考虑它只是将其扩展为单数/复数列,有效地从“高”到“宽”。 (It would be much more apparent if there were more than two categories in
Type
.) (如果
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
You can easily repeat this for Number
as well.您也可以轻松地为
Number
重复此操作。 From there, it's just a matter of merging/joining them based on the key column, Base
:从那里开始,只需根据键列
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
Consumable data:耗材数据:
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
's new pivot_wider()
function makes this simple... 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
The core idea is to identify each data point by it's type and whether it's a word or a number... then it's easy to spread to the format you want.核心思想是通过它的类型以及它是一个单词还是一个数字来识别每个数据点......然后很容易传播到你想要的格式。 (I won't bother renaming the variables or ordering them specifically to match your expected output because that's easy to do and not part of the problem here)
(我不会费心重命名变量或专门对它们进行排序以匹配您的预期输出,因为这很容易做到,而不是这里的问题的一部分)
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
You could join the plural
and singular
subsets of your data by Base
, then remove the Type
columns and reorder the others...您可以通过
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.