我正在尝试根据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), ]
。尽管我认为使用"哪个"会增加不必要的步骤。