将列中的唯一值分隔到同一数据框中的单独列中

Posted

技术标签:

【中文标题】将列中的唯一值分隔到同一数据框中的单独列中【英文标题】:Separating unique values in a column into separate columns within the same dataframe 【发布时间】:2021-05-21 15:08:57 【问题描述】:

我的数据中列出了 2010 年和 2011 年消费的水果总数。然而目前,每年的总数都在数据框的底部。相反,我希望在新列中列出每年的总数。

我当前的数据框如下所示:

Fruit Total Year
Apple 863 2010
Banana 224 2010
Orange 455 2010
Apple 934 2011
Banana 453 2011
Orange 534 2011

但是我希望它看起来像这样:

Fruit 2010 2011
Apple 863 934
Banana 224 453
Orange 455 534

我正在尝试使用 R 来做到这一点

【问题讨论】:

欢迎来到 SO!如果您提供最小可重复的示例,您将最大限度地获得有用的答案。 This post 可能会有所帮助。作为图像的数据尤其没有帮助。 【参考方案1】:

使用reshape 的基本 R 选项

reshape(
  df,
  direction = "wide",
  idvar = "Fruit",
  timevar = "Year"
)

给予

   Fruit Total.2010 Total.2011
1  Apple        863        934
2 Banana        224        453
3 Orange        455        534

#数据

> dput(df)
structure(list(Fruit = c("Apple", "Banana", "Orange", "Apple", 
"Banana", "Orange"), Total = c(863L, 224L, 455L, 934L, 453L,
534L), Year = c(2010L, 2010L, 2010L, 2011L, 2011L, 2011L)), class = "data.frame", row.names = c(NA,
-6L))

【讨论】:

【参考方案2】:

或者可以从base R使用xtabs

xtabs(Total ~ Fruit + Year, df)
#        Year
#Fruit    2010 2011
#  Apple   863  934
#  Banana  224  453
#  Orange  455  534

数据

df <- structure(list(Fruit = c("Apple", "Banana", "Orange", "Apple", 
"Banana", "Orange"), Total = c(863L, 224L, 455L, 934L, 453L,
534L), Year = c(2010L, 2010L, 2010L, 2011L, 2011L, 2011L)),
class = "data.frame", row.names = c(NA,
-6L))

【讨论】:

【参考方案3】:

您可能只想将长格式转换为宽格式,这可以通过多种方式完成。

一个例子是使用 tidyr

通过运行下面的代码,您可以从原始宽数据框创建一个新的 DF_wide,应该在单独的列中计算每年的总数。

library(tidyr)

DF_wide <- spread(DF_long, Year, Fruit, Total)

【讨论】:

以上是关于将列中的唯一值分隔到同一数据框中的单独列中的主要内容,如果未能解决你的问题,请参考以下文章

将列添加到数据框中,测试其他列中的分类变量

将列中的 NA 替换为相邻列中的值

如何为列中的每个唯一值获取数据框中的项目数[重复]

将列中的值转换为现有数据框中的行名

如何用同一数据框中其他列的实际列值替换一列中的字符串值?

将列中的数据合并为一列