我正在尝试根据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天,但找不到办法让它发挥作用。
答案 0 :(得分:1)
试试这个:
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,]
答案 1 :(得分:1)
我更喜欢使用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)
答案 2 :(得分:0)
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
)
答案 3 :(得分:0)
有两种方法 首先,这是一个包含大量行的假装数据集。这不是您的分析,只是制作一个看起来非常像您的数据集。
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)
现在我们有一些与您粘贴的结构相匹配的东西。
看起来您正在尝试进行回归?要做到这一点,你需要先放置因变量,然后是波形符,然后是所有自变量。如果您使用&#34; subset&#34;,一种方法是使用%in%。 (或者在这种情况下,否定它,以便它不在。
remove <- c("Princess Bride, The", "Avengers, The", "Fast and Furious")
IVOD <- lm(IVOD_REV_ULT ~ DBO, data=df, subset=!row.names %in% remove)
我毫不犹豫地使用&#34; grep&#34;因为它匹配部分字符串。因此,例如,所有快速和激烈的续集都将被删除,而不仅仅是我上面指定的那个。
在回归上下文之外,您可以明确地删除它们,如下所示:
subset <- df[!df$row.names %in% remove, ]
...或
subset <- df[-which(df$row.names %in% remove), ]
...虽然我认为使用&#34;其中&#34;增加了一些不必要的步骤。