【问题标题】:Dataframe in R remove rows based on certain row names [duplicate]R中的数据框根据某些行名删除行[重复]
【发布时间】:2020-07-27 18:37:07
【问题描述】:

我尝试了一段时间后放弃了...... 我想从我的数据框中删除几行。 我想根据行名删除它们。

例如

Rowname        Age
Player 1       27
Player 2       28
Player 3       25

现在我想说删除名称为“Player 1”的行和名称为“Player 2”的行。 因为它是我用来选择的行名,所以它似乎更难?!

谁能帮帮我?

谢谢你:)

【问题讨论】:

  • 使用dput() 提供您的数据。在这种情况下,重要的是要知道“Rowname”是数据中的变量还是 R 添加的 rowname。Len Greski 提供的答案假定您创建了一个名为 Rowname 的列/变量。
  • @dcarlson - 我使用问题中的Rowname 来读取带有read.csv() 的数据并将该输入设置为输出数据框的行名,但您会看到data我的答案中的数据框没有名为Rowname 的列。这就是答案使用rownames() 对数据进行子集化的原因。
  • 我明白了。我的观点是 OP 没有提供什么可能是重要的信息。但我把它弄反了。如果它是列而不是行名,则您的答案失败。

标签: r dataframe


【解决方案1】:

base R 中的行名概念可以有它的用途;但是,如果您想对它们执行任何类型的分析,最好将它们作为数据框中的实际列。这是您的数据的复制:

df <- data.frame(Age = c(27, 28, 25))
rownames(df) <- paste("Player", 1:3)
df

         Age
Player 1  27
Player 2  28
Player 3  25

这是使行名成为数据的实际部分的方法。我提供了两种方法。

将行名转换为数据列

方法一:基础R

df$Player <- rownames(df)
rownames(df) <- NULL # This code will remove the old row names and turn them into row numbers
df

  Age   Player
1  27 Player 1
2  28 Player 2
3  25 Player 3

方法二:tibble包中的rownames_to_column()函数

library(tibble)

rownames_to_column(df)

   rowname Age
1 Player 1  27
2 Player 2  28
3 Player 3  25

根据播放器对数据框进行子集

现在行名称已在您的数据框中,您可以使用它们来过滤数据。假设您的数据当前是:

df

   rowname Age
1 Player 1  27
2 Player 2  28
3 Player 3  25

你可以用基础 R 来做到这一点:

df[!(df$Player %in% c("Player 1", "Player 2")), ]

  Age   Player
3  25 Player 3

或者,如果您更喜欢 dplyr 语法:

library(dplyr)

df %>%
  filter(!(Player %in% c("Player 1", "Player 2")))

  Age   Player
1  25 Player 3

【讨论】:

  • 谢谢。我对你的方法有疑问: 方法 1:我的行名没有名字,所以我不能做“df$Player”。我试图找到如何重命名我的行名,但没有运气。方法2:不幸的是它没有做任何事情。当我做 rownames(game) 时,我仍然得到与以前相同的 rownames...
  • "我的行名没有(列)名,所以我不能这样做df$Player"_: the code df$Player 创建一个新的名为"Player"的列,并在其中存储行名。如果这样做,它将起作用。建议您复制我的代码并在本地运行它,以便研究它是如何工作的。
【解决方案2】:

一种方法是使用rownames() 以提取运算符的[ 形式选择行,如下所示。

textData <- "Rownames|Age
Player 1|27
Player 2|28
Player 3|25"

data <- read.csv(text=textData,row.names="Rownames",header=TRUE,sep="|")

此时data 数据框有一列包含三个观察值。每行都有一个行名。

# print data to show that data frame has one column, and player
# info is stored as rownames
data
> data
         Age
Player 1  27
Player 2  28
Player 3  25

接下来,我们将对数据框进行子集化。

data[!rownames(data) %in% c("Player 1","Player 2"),]

...以及输出,因为输入数据框中只有一列,所以输出为向量:

> data[!rownames(data) %in% c("Player 1","Player 2"),]
[1] 25

将此技术与subset() 结合使用会产生单行数据框:

subset(data,!rownames(data) %in% c("Player 1","Player 2"))

...和输出:

> subset(data,!rownames(data) %in% c("Player 1","Player 2"))
         Age
Player 3  25
>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-05-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-14
    • 2020-04-03
    相关资源
    最近更新 更多