r语言 - 使用精确字符串的 row.names 筛选出表行



我正在尝试根据row.names列对我的数据进行子集化。我的删除矢量中可能有 30 多个标题。我想通过使用这样工作的东西从我的集合中删除整行数据(尽管这显然不起作用)。我可以修改线性回归模型,也可以只修改原始数据集。

remove = -c("I Am A Movie", "I Am Also A Movie", "Avengers", "etc") 
IVOD = lm(IVOD, subset=remove)

我的数据看起来像这样,有 500+ 行和大约 60 列。

    row.names       IVOD_REV_ULT    DBO    
1   I Am A Movie    1234567.91      1234670
2   Avengers        123456.99       1234567

如何创建字符串向量,并仅删除那些row.names字符串完全匹配的行?这适用于数字向量,但对于重复此过程的人来说,他们可能比我更不熟悉 R,我需要他们能够看到被删除的电影的实际名称,以避免在数据排序不同时出现任何错误。某些电影可能具有相同的初始字符串(即"黑暗骑士"和"黑暗骑士崛起"),因此我还需要我的删除命令来仅删除完美匹配。

提前感谢 - 如果这比我想象的容易,请道歉。我已经研究了 2 天,但找不到让它工作的方法。

试试这个:

df <- data.frame(row.names = c("apple", "banana", "orange", "lemon", "lime"), 
             value = c(1:5))
remove_these <- c("apple", "orange")

现在我们找到需要删除的行的指示

rows_to_remove <- which(row.names(df) %in% remove_these)

并使用您之前尝试使用的相同技术来删除行。

df <- df[-rows_to_remove,]

我更喜欢使用 data.table 的子集函数来执行此操作。以下是我如何使用data.table来做到这一点。

  library (data.table)
  library (random)
  library (dplyr)
  #create a fake dataset with movie names and rating
  set.seed (5280)
  foo.data <- data.table (movie.name = as.character (randomStrings (n = 25, len = 2, digits = FALSE)), rating = as.integer (runif (n = 25, min = 0, max = 5)))
  #create a dataset of movie names to remove
  remove <- sample_n (foo.data, size = 10)
  #remove the movies using data.table subset
  new.foo.data <- subset (foo.data, !movie.name %in% remove$movie.name)
df <- data.frame(states = state.name, region = state.region)
head(df)
#       states region
# 1    Alabama  South
# 2     Alaska   West
# 3    Arizona   West
# 4   Arkansas  South
# 5 California   West
# 6   Colorado   West
remove <- c("Arkansas|Florida")
grepl(remove, df$states)
# [1] FALSE FALSE FALSE  TRUE FALSE FALSE FALSE FALSE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
# [18] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
# [35] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
df[grepl(remove, df$states), ]
#     states region
# 4 Arkansas  South
# 9  Florida  South
df[!grepl(remove, df$states), ] # answer
# or subset(df, !grepl(remove, df$states))

一天结束时,在正则表达式中使用管道|运算符 grepl或其变体(请参阅?grep

有几种方法。
首先,这是一个包含大量行的假装数据集。 这不是您的分析,只是为了创建一个看起来与您的数据集非常相似的数据集。

movie.url <- "http://vincentarelbundock.github.io/Rdatasets/csv/ggplot2/movies.csv"
download.file(movie.url, "movies.csv")
movie.data <- read.csv("movies.csv", stringsAsFactors=FALSE)
row.names <- unique(movie.data$title)
IVOD_REV_ULT <- round(runif(n=length(row.names), min=123456, max=234567), digits=1)
DBO <- round(runif(n=length(row.names), min=123456, max=234567), digits=0)
df <- as.data.frame(cbind(row.names, IVOD_REV_ULT, DBO))
df$IVOD_REV_ULT <- as.numeric(df$IVOD_REV_ULT)

现在我们有一些与您上面粘贴的结构相匹配的东西。

看起来您正在尝试进行回归? 为此,您需要先放置因变量,后跟波浪号,然后是所有自变量。如果使用"子集",一种方法是使用 %in%。(或者在这种情况下,否定它,这样它就不在里面。

删除一些电影进行回归。

remove <-  c("Princess Bride, The", "Avengers, The", "Fast and Furious") 
IVOD <- lm(IVOD_REV_ULT ~ DBO, data=df, subset=!row.names %in% remove)

我会犹豫使用"grep",因为它匹配字符串的一部分。 因此,例如,所有的速度与激情续集都将被删除,而不仅仅是我上面指定的续集。

在回归上下文之外,您可以显式删除它们,如下所示:

subset <- df[!df$row.names %in% remove, ]

或。。。

subset <- df[-which(df$row.names %in% remove), ]

。尽管我认为使用"哪个"会增加不必要的步骤。

相关内容

最新更新