15种解决R中数据帧问题的简便方法

本文概述

  • 根本:什么是R数据帧?
  • 基础知识:问题和解决方案
  • 超越基础:更多问题, 更多答案
  • 从数据结构到数据分析, 数据处理和数据可视化
R数据帧经常在Stack Overflow和Reddit等公共论坛上引起轰动。 R的入门用户经常会遇到这种特定数据结构的问题, 而且看起来并不总是那么简单。但这真的需要吗?
好吧, 不一定。
在今天的帖子中, srcmini希望向你展示这些R数据结构不必太难:我们为你提供了15种简单, 直接的解决方案, 以解决data.frame最常见的问题。这些问题是从最新的, 粘性的或推荐的Stack Overflow帖子中选择的。
(要在R中练习数据帧, 请尝试srcmini R课程介绍中的数据帧一章。)
根本:什么是R数据帧? 有了数据帧, R允许你将数据存储在可概述的矩形网格中, 从而为你迈出了重要的第一步。这些网格的每一行对应于一个实例的度量或值, 而每一列都是一个包含特定变量数据的向量。
这意味着数据帧的行不必包含但可以包含相同类型的值:它们可以是数字, 字符, 逻辑等。
如下所示, 每个实例(在第一个未命名列中列出并带有数字)具有某些特征, 这些特征分布在其余三列中。每列都必须由相同类型的值组成, 因为它们是数据向量:因此, breaks列仅包含数字值, 而woole和张力列具有作为值存储为因子的字符。
如果你想知道, 该数据是关于编织过程中纱线断头的次数:)。
【15种解决R中数据帧问题的简便方法】请记住, 因子是只能包含有限数量的不同值的变量。因此, 它们通常被称为分类变量。
也许你已经注意到此数据结构类似于矩阵的数据结构, 但事实是它们的数据值不必是同一类型, 而矩阵确实需要这样做。
数据帧也与列表具有相似性, 列表基本上是组件的集合。但是, 它是具有相同长度向量结构的列表。因此, 它们实际上可以看作是列表的特殊类型, 可以作为矩阵或列表进行访问。
如果你想了解更多信息, 或者只是想回顾一下R中的五个常规数据结构, 请观看下面的小视频:
15种解决R中数据帧问题的简便方法 如你所见, 有不同的数据结构对数据的存储方式提出了不同的要求。数据帧特别方便存储多个数据向量, 这使组织数据, 对其应用功能以及保存工作变得更加容易。
几乎就像只有一个电子表格包含所有长度相同的元素一样!
基础知识:问题和解决方案 如何在R中创建一个简单的数据帧
即使查看该数据结构的内置示例(例如esoph)很有趣, 也可以很轻松地获得更多乐趣!
怎么样?
当然, 通过练习自己的例子!你可以通过首先制作一些矢量来非常容易地做到这一点:
Died.At < - c(22, 40, 72, 41) Writer.At < - c(16, 18, 36, 36) First.Name < - c("John", "Edgar", "Walt", "Jane") Second.Name < - c("Doe", "Poe", "Whitman", "Austen") Sex < - c("MALE", "MALE", "MALE", "FEMALE") Date.Of.Death < - c("2015-05-10", "1849-10-07", "1892-03-26", "1817-07-18")

接下来, 只需将你制作的矢量与data.frame()函数结合起来:
请记住, 这种类型的数据结构需要相同长度的变量。检查在分配给向量的所有c()函数中是否放置了相同数量的参数, 并且是否已用” ” 指示单词字符串。
另外, 请注意, 当你使用data.frame()函数时, 字符变量将作为因子或分类变量导入。使用str()函数可进一步了解writers_df。
但是, 如果你对检查writers_df的第一行和最后一行更感兴趣, 则可以分别使用head()和tail()函数。
你会看到writers_df的First.Name, Second.Name, Sex和Date.Of.Death变量已全部作为因素读取。
但是你真的想要这个吗?
  • 对于变量First.Name和Second.Name, 你不需要这样做。你可以使用I()函数将它们隔离。此功能禁止解释其参数。换句话说, 通过稍微改变矢量First.Name和Second.Name的定义并添加I()函数, 可以确保不将正确的名称解释为因素。
  • 你可以将性别向量作为一个因素, 因为此变量只能具有有限数量的可能值。
  • 另外, 对于变量Date.of.Death, 你也不想设置因子。如果将值注册为日期会更好。你可以将as.Date()函数添加到此变量中, 以确保发生这种情况。
如果你使用其他函数(例如read.table()或其他用于输入数据的函数)(例如read.csv()和read.delim()), 则会得到一个数据帧作为结果。这样, 使用以下函数将看起来像下面这样的文件或具有其他定界符的文件转换为R后, 便会对其进行转换。
22, 16, John, Doe, MALE, 2015-05-10 40, 18, Edgar, Poe, MALE, 1849-10-07 72, 36, Walt, Whitman, MALE, 1892-03-26 41, 36, Jane, Austen, FEMALE, 1817-07-18

如果你想进一步了解如何将Excel文件读取和导入到R中, 请务必查看我们的教程!或者, 你可以在read.table上签出Rdocumentation页面。
如何更改数据帧的行名和列名
数据帧还可以具有一个名称属性, 通过它可以查看所包含的变量的名称。换句话说, 你还可以设置标题。
在制作writers_df之前, 你已经进行了此操作。
你会看到变量Died.At, Writer.At, First.Name, Second.Name, Sex和Date.Of.Death的名称出现:
现在你已经看到writers_df的名称, 现在不确定这些名称是否有效或正确。要更改显示的名称, 你可以轻松地继续使用names()函数。
但是, 请确保c()函数中的参数个数等于已包含在writers_df中的变量数。
在这种情况下, 由于有六个变量Died.At, Writer.At, First.Name, Second.Name, Sex和Death, 因此在c()函数中需要六个参数。
否则, 其他变量将被解释为” NA” 。
还要注意如何将c()函数的参数作为字符串输入!
提示:尝试从c()函数中忽略最后两个参数, 看看会发生什么!
请注意, 你还可以分别使用函数colnames()和rownames()访问和更改列名和行名:
如你所知, 此数据结构与矩阵有相似之处。这意味着大小取决于你合并到其中的行数和列数。
要检查writers_df中有多少行和列, 可以使用dim()函数:
此函数的结果表示为[1] 46。就像矩阵一样, 维数由行数和列数定义。
请注意, 你还可以通过在dim()函数中添加带有索引的[]来检索行数或列数。
你还可以通过使用函数nrow()和ncol()来分别检索writers_df的行数和列数, 以分别检索行数或列数:
请注意, 由于数据结构也类似于列表, 因此你还可以使用length()函数来检索列数。
如何访问和更改数据帧的值
你可以通过两种主要方法来访问和更改这些值。在本部分中, 你将看到并练习它们!
…。通过变量名 现在, 你已经检索并设置了writers_df的名称, 现在你想仔细看一下其中实际存储的值。
你可以通过两种简单的方法来访问这些值。
首先, 你可以尝试通过只输入数据帧的名称和变量名称来访问它们:
请注意, 如果更改向量Age中的值之一, 则此更改将不会合并到writers_df中。
最后, 使用这种访??问值的方法, 你只需创建某个变量的副本!
因此, 对变量进行的任何更改都不会更改数据帧的变量。
…通过[, ]和$表示法 你还可以使用[, ]表示法访问writers_df的值:
请记住, 维度是按列定义的。
[, ]表示法的替代方法是使用$表示法, 如下所示:
writers_df$Age.At.Death

还请注意, 你还可以通过简单地使用这些符号来执行数学运算来更改值。
如果你真的想让手更脏, 并更改writers_df的某些值, 则可以使用[, ]表示法来实际更改值:
为什么以及如何附加数据帧
$表示法非常方便, 但是当你每次要使用数据时都必须键入它时, 它会变得非常烦人。
attach()函数提供了解决方案:它将数据帧作为参数并将其放置在搜索路径中位置2处。
因此, 除非位置1中的变量与你输入的数据帧中的变量完全相同, 否则这些变量将被视为可以立即调用的变量。
请注意, 搜索路径实际上是R访问文件的顺序。你可以通过输入search()函数进行查找。
请注意, 你也可以使用with()函数来附加writers_df, 但这需要你指定更多参数。
你会收到一条错误消息, 告诉你” 以下对象被.GlobalEnv屏蔽:” 。
这是因为在全局环境中有与数据帧同名的对象。如果不更改其名称, 这些对象可能就是你在上面创建的矢量。
你有两种解决方案:
  1. 你只是不在全局环境中使用这些名称创建任何对象。对于那些通过read.table(), read.csv()或read.delim()导入数据的人来说, 这是一个更好的解决方案, 但实际上并不适合这种情况。
  2. 你可以在数据帧中重命名对象, 以免发生冲突。这是本教程中应用的解决方案。因此, 请使用names()或colnames()函数重命名你的列。
请注意, 如果其他所有方法均失败, 则只需记住始终使用$表示法来引用列名!
取消屏蔽对象后, 现在就可以安全地执行以下命令, 并且可以实际访问/更改所有writers_df变量的值:
Age.At.Death < - Age.At.Death-1 Age.At.Death

如何将功能应用于数据帧
现在, 你已经通过放置标题成功地制作和修改了writers_df, 你可以开始对其应用函数了!
在某些情况下, 你需要计算填充物, 你可能希望将数字数据放在单独的数据帧中:
只有这样, 你才能开始获取例如数字数据的平均值和中位数。
你可以使用apply()函数执行此操作。此函数的第一个参数应该是较小的数据帧, 在这种情况下为Ages。第二个参数指定在计算平均值或中位数时要考虑的数据:列或行。
在这种情况下, 你需要计算变量Age.At.Death和Age.As.Writer的中位数和均值, 这些变量指定了writers_df中的列。
然后, 最后一个参数指定要对数据进行的精确计算:
你是否想进一步了解apply()函数以及如何使用它?
srcmini的Intermediate R课程, 除其他外, 它教你如何使用此函数以及其余apply()函数系列使R代码更有效和更具可读性。
超越基础:更多问题, 更多答案 现在, 你已经了解了基本的陷阱, 现在是时候查看在更深入地使用这些数据结构时可能已经遇到的一些问题, 问题或困难。如果你是本主题的新手, 那么以下部分将帮助你加强数据帧游戏。
现在就更有理由开始吧!
如何创建一个空的数据帧
创建空数据帧的最简单方法可能是仅分配一个data.frame()函数, 不向向量添加任何参数:
然后, 你可以使用[, ]表示法开始填充腹部。
但是要小心, 因为这样做很容易出错!
请注意, 你如何在此空数据集中看不到任何列名称。如果你确实希望拥有这些向量, 则可以在ab中初始化空向量, 如下所示:
如何提取行和列, 设置数据帧架的子集
子集或提取特定的行和列是一项重要技能, 以超越第二步中介绍的基础知识, 因为它使你可以轻松地处理较小的原始数据集。
基本上, 你需要从行和列中提取这些值, 以优化你进行的数据分析。
使用第二步中描述的[, ]符号开始子集很容易:
请注意, 你也可以使用变量名称定义此子集。
提示:只对一列进行分组时要小心!
R有简化结果的趋势, 这意味着它将以向量的形式读取子集, 这通常是你不希望获得的。
为确保不会发生这种情况, 你可以添加参数drop = FALSE:
在下一步中, 你可以尝试使用subset()函数进行子设置:
请注意, 你也可以将grep()用作子集。在上面的srcmini Light块中, 你使用了grep()来完成工作。你隔离了Age.At.Death列中的行, 这些行的值包含” 4″ 。
请注意, 通过子设置, 你基本上停止考虑某些值。这可能意味着你删除了某个因素的某些功能, 例如, 仅考虑了writers_df的MALE成员。
请注意, 即使你创建了一个子集, 该列的所有因子水平仍如何保持存在:
你可以使用factor()删除不再存在的因子级别, 可以输入以下代码行。
如何从数据帧中删除列和行
如果要删除值或整个列, 则可以将NULL值分配给所需的单位:
要删除行, 该过程要复杂一些。你定义一个新的向量, 在其中为每行列出是否包含它。
然后, 将此向量应用于writers_df:
请注意, 你也可以通过添加!来相反地指出相反的情况。另请注意, 你也可以使用阈值。在上面的代码块中, 你指定只希望保留所有年龄超过40岁的写作者死亡。
如何在数据帧中添加行和列
与使用[, ]和$表示法访问和更改单个值的方式几乎相同, 还可以轻松地将列添加到writers_df:
将行追加到现有数据帧会稍微复杂一些。
为了轻松地做到这一点, 首先要在向量中创建新行, 同时尊重writers_df中定义的列变量, 然后使用rbind()函数将该行绑定到原始数??据帧:
为什么以及如何将R数据帧从宽格式转换为长格式, 反之亦然
如果你有多个值, 并且分布在多个列中, 则对于同一实例, 你的数据将采用” 宽” 格式。
另一方面, 如果数据为” 长” 格式, 则每个变量只有一个观察行。因此, 每个实例有多个行。
让我们用一个例子来说明。长数据如下所示:
如你所见, Type变量中的每个值都有一行。许多统计测试都赞成这种格式。
宽格式的数据如下所示:
你会看到每一列代表各种因素与值的唯一配对。
由于不同的功能可能要求你以” 长” 或” 宽” 格式输入数据, 因此你可能需要调整数据集的形状。
你可以在此处选择两个主要选项:你可以使用stack()函数, 也可以尝试使用reshape()函数。
当你使用简单的数据帧时, 前者是首选, 而后者则更常用于更复杂的数据帧, 主要是因为这两种功能提供的可能性有所不同。
确保继续阅读以进一步了解stack()和reshape()函数之间的可能性差异!
使用stack()用于简单结构化的数据帧 stack()函数基本上将多个向量与指示每个观察值起源的因素串联或组合为一个向量。
要从宽格式到长格式, 你将必须堆叠观察值, 因为你希望每个变量一个观察行, 每个变量多个行。
在这种情况下, 你希望将” 读取” , “ 写入” 和” 收听” 列, 名称和值合并在一起:
要从长格式到宽格式, 你需要对数据进行拆栈, 这很有意义, 因为你希望每个实例一行, 每个值作为不同的变量显示。
请注意, 你要弄清” 结果” 和” 测试” 列:
对复杂数据帧使用reshape() 此功能是stats软件包的一部分。此函数与stack()函数相似, 但更为复杂。阅读并亲自了解如何使用reshape()函数重塑数据:
要从宽数据格式变为长数据格式, 你可以首先通过输入reshape()函数开始。
第一个argumnet应该始终是原始的宽数据集。
在这种情况下, 你可以指定要输入observations_wide, 以将其转换为长数据格式。
然后, 你开始向reshape()函数添加其他argumnet:
  1. 包括变量名称列表, 这些变量名称通过变化来定义不同的度量。在这种情况下, 你可以将特定测试的分数存储在” 读取” , “ 写入” 和” 收听” 列中。
  2. 接下来, 添加argumentv.names以为长数据集中包含这些值的变量指定要赋予的名称。在这种情况下, 你希望将所有阅读, 写作和听力测试的所有分数合并为一个变量。
  3. 你还需要给变量起一个名称, 该变量描述使用参数timevar输入的不同度量。在这种情况下, 你想为包含给学生的测试类型的列命名。因此, 此列的名称应称为” 测试” 。
  4. 然后, 你将自变量times添加到自变量, 因为你需要指定新列” Test” 只能采用三个值, 即你已存储的测试组件:” Read” , ” Write” , ” Listen” 。
  5. 你终于到了!输入带有参数方向的数据的最终格式。
  6. 此外, 你可以使用参数new.row.names指定新的行名称。
提示:尝试忽略最后一个参数, 看看会发生什么!
从长到宽, 你将采取相同的步骤。首先, 你采用reshape()函数并为其提供第一个参数, 即你要重塑的数据集。其他参数如下:
  1. timevar允许你指定应该分解变量Test, 该变量描述你提供给学生的不同测试。
  2. 你还指定reshape()函数不应考虑原始数据集的主题和性别变量。你将这些列名称放入idvar。
  3. 通过不命名变量Result, reshape()函数将知道Test和Result应该重新组合。
  4. 你指定重塑的方向, 在这种情况下, 该方向很宽!
请注意, 如果你愿意, 还可以重命名或排序这些新的长而宽的数据格式的结果!你可以在下面找到详细说明。
使用tidyr重塑数据帧 该软件包可让你” 使用spread()和gather()函数轻松整理数据” , 而这正是使用该软件包重塑数据时要做的事情!
如果要从宽格式转换为长格式, 则其原理与reshape()的原理相似:你使用collect()函数并开始指定其参数:1.数据集是collect的第一个参数()函数2。然后, 指定列名, 在该列中将合并读取, 写入和侦听的值。在这种情况下, 你想将其命名为Test或Test.Type。 3.输入列名, 其中列出了” 读取” , “ 写入” 和” 侦听” 列的所有值。 4.你指出应该将哪些列合并为一列。在这种情况下, 这将是从读取到侦听的列。
请注意, 最后一个参数是如何以与你对writers_df子集进行子集化或选择你想要在其中执行数学运算的writers_df列相同的方式指定列的。
你也可以像这样分别指定列:
long_tidyr < - gather(observations_wide, Test, Result, Read, Write, Listen) long_tidyr

提示:尝试在上方的srcmini Light框中更改代码以进行测试!
从长格式到宽格式的相反方向与上面的函数非常相似, 但是这次使用了split()函数:
同样, 你将数据集作为第一个参数。然后, 你指定包含新列名称的列。
在这种情况下, 就是测试。
最后, 输入包含应放入新列中的值的列的名称。
提示:请参阅” 使用dplyr和tidyr备忘单进行数据整理” , 以全面了解这些软件包可为你提供处理数据的可能性!
使用reshape2重塑数据帧 该软件包使你可以” 灵活地重塑数据” 。要从宽数据格式到长数据格式, 请使用其melt()函数。
这个函数非常简单, 因为它只需要你的数据集和id.vars参数, 你可能已经从reshape()函数中知道了。此参数允许你指定函数应保留哪些列。
但是, 正如你将注意到的, 在上面的代码块中还指定了另外两个参数:
  • measure.vars用来命名将合并原始列的目标列。如果忽略此参数, 那么melt()函数将使用所有其他变量作为id.vars。
  • variable.name指定你要如何命名该目标列。如果不指定此参数, 则结果中将有一个名为” 变量” 的列。
  • value.name允许你输入将存储值或测试结果的列的名称。如果忽略此参数, 则此列将命名为” measurement” 。
你也可以使用带有dcast()函数的reshape2包, 从长格式到宽格式。
这相当容易:你像往常一样先输入数据集。然后, 你合并不想触摸的列;
在这种情况下, 你希望保持” 主题” 和” 性别” 不变。但是, “ 测试” 列要拆分!因此, 这是第二个参数的第二部分, 以?表示。此函数的最后一个参数是value.var, 它保存不同测试的值。你想将此新列命名为结果:
如何对数据帧进行排序
按列排序似乎很棘手, 但是可以使用R的内置order()函数或使用包来简化。
R的内置Order()函数 例如, 你可以按数据帧的一列进行排序。你可以根据变量Age.As.Writer中存储的值对行进行排序:
writers_df[order(Age.As.Writer), ]

如果要按从高到低的顺序对值进行排序, 则只需添加额外的argument(减少)即可, 该参数只能采用逻辑值。
请记住, 逻辑值分别为TRUE或FALSE。
另一种方法是添加函数rev(), 使其包含order()函数。顾名思义, 该函数提供了一种方法, 可以为你提供其参数的相反版本, 在本例中为order(Name):
你还可以在要订购的数字变量前面添加-。
请注意, 具有其他数据类型(例如因子)的变量需要先将其转换为字符或数字, 然后才能对其进行实际排序:
as.character(Gender)

你还可以对两个变量进行排序。在这种情况下, order()需要有两个参数, 以便你首先按order()函数的第一个参数排序, 然后再对第二个参数排序。
你将在本教程中进一步看到此示例。
用dplyr排序 dplyr软件包以其处理数据的能力而闻名, 它具有特定功能, 可让你按变量对行进行排序。
Dplyr实现这一目标的功能是ranging()。
该函数的第一个参数是要排序的数据集, 而第二个和第三个参数是你选择排序的变量。
在这种情况下, 你首先对变量Age.At.Death进行排序, 然后对Age.As.Writer进行排序:
你也可以使用with()函数获得相同结果的方法。
请注意, 如果要按降序对列进行排序, 可以将函数desc()添加到变量中。
你是否想对dplyr软件包做更多的事情?看看我们的dplyr R中的数据操作教程, 该课程将教你如何使用dplyr执行复杂的数据操作任务!
另外, 别忘了看一下RStudio的” 使用dplyr和tidyr备忘单进行数据整理” !
其他排序数据帧的选项 还有许多其他提供排序功能的软件包。本节仅简要介绍现有的软件包。首先, taRifx包提供了sort.data.frame(), 通过它可以再次按降序对Age.At.Death中的值进行排序:
library(taRifx) sorted_data < - sort(writers_df, decreasing=TRUE, ~Age.At.Death) sorted_data

第三, 还有doBy软件包, 提供了orderBy()函数。在这种情况下, 你要首先将Age.At.Death的值从高到低排序, 然后再根据Age.As.Writer变量的值排序。
library(doBy) sorted_data_two < - orderBy(~-Age.At.Death+Age.As.Writer, writers_df) sorted_data_two

如何合并数据帧
合并列名称上的数据帧 你可以使用merge()函数来连接两个但仅两个数据帧。
假设你有data2, 它具有存储在变量Age.At.Death中的相同值, 该值也可以在writers_df中找到, 并且具有完全相同的值。因此, 你希望基于此变量将两者合并:
你可以轻松合并以上两个数据帧。
提示:检查如果更改merge()函数的两个参数的顺序会发生什么!
这种合并方式等效于SQL中的外部联接。
不幸的是, 你并不总是如此幸运。在许多情况下, 某些列名或变量值会有所不同, 这使得难以遵循刚才介绍的简单, 标准的过程。此外, 你可能并不总是希望以上述标准方式进行合并。
在下面, 列出并解决了一些最常见的问题!
如果……(某些)数据帧的列值不同怎么办? 如果你要合并的变量的(某些)值不同, 那么你将遇到一个小问题, 因为merge()函数假定这些值相同, 因此可以添加第二个数据帧中存在的任何新变量。正确到第一个。
考虑以下示例:
> data2 x.Age.At.Death Location 1215 2396 3717 4408

你会看到属性Age.At.Death的值与为writers_df定义的值不匹配。
不用担心, merge()函数提供了额外的参数来解决此问题。
参数all.x允许你指定将Location变量的额外行添加到结果数据帧中, 即使writers_df中不存在此列。
在这种情况下, 对于Age.At.Death属性值对应的那些行, Location变量的值将添加到writers_df中。两个数据帧的Age.At.Death不对应的所有行都将填充NA值。
请注意, 此联接与SQL中的左外部联接相对应, 并且all.x参数的默认值为FALSE, 这意味着一个通常仅考虑合并变量的相应值。
还请注意, 如果要为在writers_df中data2没有匹配行的每一行添加额外的行, 还可以指定参数all.y = TRUE。
对于那些熟悉SQL的人, 这种连接对应于正确的外部连接。
如果……两个数据帧具有相同的列名怎么办? 如果你的两个数据帧具有完全相同的两个变量(带有或不带有相同值)怎么办?
你可以选择保留所有对应变量的所有值, 并将行添加到结果数据帧中:
或者, 你也可以选择从一个与死亡年龄相对应的特定变量中添加值。
如果……数据帧的列名不同怎么办? 最后, 如果你合并的变量名称不同, 该怎么办?
你只需在merge()函数中通过参数by.x和by.y指定另外两个规范。
合并行名称上的数据帧 你确实可以合并两个数据帧的列, 这些数据帧包含一组不同的列, 但某些行具有相同的名称。 merge()函数及其参数可助你一臂之力!
考虑第二个示例:
Address < - c("50 West 10th", "77 St. Marks Place", "778 Park Avenue") Maried < - c("YES", "NO", "YES") limited_writers_df < - data.frame(Address, Maried)

你会看到此数据集包含三行(标记为数字1至3)以及另外两个不在writers_df中的列。若要合并这两个参数, 请将参数by添加到merge()函数中, 并将其设置为数字0, 该数字指定行名。
由于你选择保留所有对应变量中的所有值并向结果中添加列, 因此将all参数设置为TRUE:
可能是两个数据结构中都没有出现的行字段产生NA值。你可以通过删除它们轻松解决此问题。
下面将讨论如何执行此操作。
如何删除具有NA值的数据帧行和列
要删除所有包含NA值的行, 最简单的选择之一是使用na.omit()函数, 该函数将你的数据帧作为参数。
让我们循环使用上一节中的代码, 在那里你会得到很多NA值:
请注意, 上面的示例还演示了, 如果你只想选择要从中删除NA值的数据帧的一部分, 最好使用complete.cases()。
在这种情况下, 你希望保留Age.As.Writer和Name列的值均完整的所有行。
如何在数据结构之间转换
将列表或矩阵转换为数据帧 可以使用as.data.frame()函数将符合数据帧结构施加的限制的列表或矩阵强制转换为数据帧。
请记住, 数据帧类似于矩阵的结构, 其中的列可以是不同的类型。列表也有相似之处, 其中每一列都是列表的一个元素, 每个元素具有相同的长度。你要转换的任何矩阵或列表都需要满足这些限制。
例如, 矩阵A可以转换, 因为每一列都包含数字数据类型的值。你输入矩阵A作为as.data.frame()函数的参数:
你可以对列表执行相同的步骤, 如下所示:
将数据帧转换为矩阵或列表 要采取相反的行动, 即将数据帧转换为矩阵和列表, 你首先必须检查一下自己是否可行。你的writers_df是否包含一个或多个维度, 数据类型的数量如何?
如果不确定要选择哪种数据结构, 请重新观看简介中的小动画。
找到答案后, 可以使用函数as.matrix()和as.list()分别将writers_df转换为矩阵或列表:
对于那些想专门制作数字矩阵的人, 可以使用data.matrix()函数或将sapply()函数添加到as.matrix()函数中:
请注意, 对于包含混合数据类型的当前writers_df, 将在所得矩阵中引入NA值。
从数据结构到数据分析, 数据处理和数据可视化 使用此R数据结构只是数据分析的开始!
如果本教程让你兴奋地更深入地学习R编程, 请确保查看我们免费的交互式R入门课程。
那些已经对R有了更高级的知识并希望将其技能提升到更高水平的人, 可能会对我们的数据处理和数据可视化课程感兴趣。
转到我们的课程概述, 看看吧!

    推荐阅读