将R中数据帧的行转换为列

将R中数据帧的行转换为列,r,dataframe,reshape,R,Dataframe,Reshape,我有一个这样的数据集 movieID title year country genre directorName Rating actorName1 actorName.2 1 hello 1995 USA action john smith 6 tom hanks charlie sheen 2 MI2 1997 USA ac

我有一个这样的数据集

movieID    title   year   country    genre  directorName    Rating     actorName1     actorName.2
1          hello    1995    USA      action    john smith       6        tom hanks      charlie sheen
2          MI2      1997    USA      action    mad max          8        tom cruize     some_body
3          MI2      1997    USA      thriller  mad max          8        tom cruize     some_body
基本上,有许多行只是有一个不同的用户给定的流派,我想列有genre1,genre2


我尝试了重塑(),但它只能基于某个ID变量进行转换。如果有人有任何想法,请让我知道

尝试使用dplyr和tidyr:

library(tidyr)
library(dplyr)
df %>% mutate(yesno=1) %>% spread(genre, yesno, fill=0)
这将创建一个列yesno,该列仅为每种类型提供一个要填写的值。然后我们可以使用tidyr的spread。fill=0意味着用0代替NA来填充那些不属于该类型的内容

之前:

     genre         title yesno
1   action lethal weapon     1
2 thriller       shining     1
3   action         taken     1
4    scifi         alien     1
之后:

          title action scifi thriller
1         alien      0     1        0
2 lethal weapon      1     0        0
3       shining      0     0        1
4         taken      1     0        0

使用dplyr和tidyr尝试以下操作:

library(tidyr)
library(dplyr)
df %>% mutate(yesno=1) %>% spread(genre, yesno, fill=0)
这将创建一个列yesno,该列仅为每种类型提供一个要填写的值。然后我们可以使用tidyr的spread。fill=0意味着用0代替NA来填充那些不属于该类型的内容

之前:

     genre         title yesno
1   action lethal weapon     1
2 thriller       shining     1
3   action         taken     1
4    scifi         alien     1
之后:

          title action scifi thriller
1         alien      0     1        0
2 lethal weapon      1     0        0
3       shining      0     0        1
4         taken      1     0        0
如果您了解
restrape()
查看数据的镜头,可以使用
restrape()
执行此操作


背景

首先,在数据管理的上下文中考虑“<强>记录>强”的概念。通常,在数据表中,每条记录都应对应于定义良好的数据单元,简称为记录单元,其中一列或多列作为标识或关键变量,用于区分记录单元的唯一实例

通常,单位由一组标量变量描述。换句话说,每个记录都与一个或多个标量值相关联,每个标量值都提供有关单位的单个信息。在一个非常简单的世界中,单位的所有属性都是标量的,因此可以将每个变量表示为单个列向量,每个元素/单元对应一个记录单位,从而为该特定单位提供该特定属性的值


除了属性的概念之外,识别单元的类型或分组分类是可能的,也是非常常见的。这些通常表示为单位的附加标量属性

当人们谈论表格数据的长格式与宽格式时,他们通常指的是这些类型分类在表格中的布局。数据布局的选择与表中单个记录表示的单位的选择直接相关。这实际上是一个相同的选择

例如,在一个每个个体有多个测量值的实验中,每个记录可以存储一个测量值,在多个记录上代表个体,并有一个类型列来区分测量值类型。或者,每个记录可以存储一个单独的数据,每个测量值由一个列表示。就彼此而言,前者格式较长,后者格式较宽。但是现在考虑,如果每个个体属于实验中的单个实验组,则可以将每个记录存储一个组,每个个体由一组列表示,并且每个测量由集合内的一个列表示。如果你愿意的话,这是一种“更广泛”的格式。这都是相对的


不幸的是,单位特征有时比简单的标量值更复杂。最常见的情况是多值属性,有时描述为多对一关系(特别是在DBMS的上下文中)。换句话说,属性的多个值可以与单个记录单元相关联。在这种情况下,不可能将多值属性表示为数据集中的简单列向量。程序员在尝试处理这种复杂性时,经常会遇到一些难题,例如:

  • 将多个值串联为单个标量值(例如单个逗号分隔字符串或位向量)。让我们称之为“串联黑客”
  • 为属性的每个值复制单位记录。(这通常只有在数据集中只有一个属性是多值的情况下才可行。)让我们称之为“复制黑客”
  • 将属性拆分为自身的多个“实例”,每个实例存储在自己的列中。让我们称之为“分离黑客”
  • 只是尝试忽略多个值中的一个以外的所有值。让我们称之为“无知黑客”
在某些上下文中,可以使用特殊的数据类型更恰当地将数据表示为伪列向量。例如,PostgreSQL提供了一个,甚至是R数据。frames可以有列表列,其单个元素可以包含R支持的任何数据类型,包括多元素向量。这些表示通常比前面提到的黑客更可取

我不认为最广泛使用的解决方案是将多值属性与主数据表完全分离,而是将其存储为一个单独的表,该表链接到键上的主表。辅助表中的每个记录都有一个主表中记录的键,并在键旁边存储多值属性的单个值。这是关系模型提倡的设计

当然,这些方法都有自己的折衷方案,对于给定的情况,哪种分析是最佳的,可能非常复杂、模糊,甚至有些主观。我在这里不想再详细说明了


在我开始讨论
重塑()
之前,需要强调的是,单元类型与多值属性是完全不同的。重塑数据通常被认为是关于管理键入和记录单元选择。它不应该是关于管理多值属性布局的,但是它可以以这种方式使用,我们将看到


最抽象的,
reformate()
可用于转换一组类型化标量数据列