子集值在R中不相加

子集值在R中不相加,r,R,我在R中有一个数据帧df。所有列都是字符类 > dim(df) [1] 1000 6 我试图删除df$entry==c7795的行 正如您在上面看到的,我有35个条目要从数据框中删除。但是,当我使用子集删除这些时,它不会删除正确的数量: entries_to_remove <- subset(df, entry != c("7795")) > dim(entries_to_remove) [1] 648 6 上面的命令本应删除35个条目,但却删除了352个条目。

我在R中有一个数据帧df。所有列都是字符类

> dim(df)
[1] 1000      6
我试图删除df$entry==c7795的行

正如您在上面看到的,我有35个条目要从数据框中删除。但是,当我使用子集删除这些时,它不会删除正确的数量:

entries_to_remove <- subset(df, entry != c("7795"))
> dim(entries_to_remove)
[1] 648  6

上面的命令本应删除35个条目,但却删除了352个条目。有人知道为什么会发生这种情况吗?

上述解决方案不起作用,我认为问题不在于NA。然而,我自己解决了这个问题。这是一个解决办法,但它奏效了:

# list the row numbers for the entries to remove
row_remove <- rownames(entries_to_remove )

# make a list of all the row numbers
all_rows <- 1:dim(df)[1]

# create a vector with only the rows to keep
subset_row <- all_rows[!(all_rows%in%row_remove)]

# subset the dataframe with these rows
df<- df[subset_row,]

下面是另一个解决方案,它只占用一行:

df[-which(grepl("7995", apply(df, 1, paste0, collapse = " "))),]
结果:

  v1 entry1 entry2 entry3
2  2      5      5      2
3  3      2      4      2
4  4      2      3      1
6  6      1      2      1
7  7      2      4      4
8  8      4      5      5
9  9      5      1      5
数据:


这个问题与NAs有关,其他一些解决方案也可以使用,但最简单也是最实用的方法是在%中使用%,而不是在%中使用==

entries_to_remove <- subset(df, !(entry %in% c("7795")))
entries_to_remove <- subset(df, entry %in% c("7795"))
您不能使用NA检查subsetdf,is.naentry进行子集。df$条目中是否有NAs?
set.seed(121)
df <- data.frame(
  v1 = 1:10,
  entry1 = c(sample(1:5, 9, replace = T), 7995),
  entry2 = c(sample(1:5, 4), 7995, sample(1:5, 5)),
  entry3 = c(7995, sample(1:5, 9, replace = T))
)

df[2:4] <- lapply(df[2:4], as.character) # convert to character, as in your data

df
   v1 entry1 entry2 entry3
1   1      1      2   7995
2   2      5      5      2
3   3      2      4      2
4   4      2      3      1
5   5      3   7995      2
6   6      1      2      1
7   7      2      4      4
8   8      4      5      5
9   9      5      1      5
10 10   7995      3      5
entries_to_remove <- subset(df, !(entry %in% c("7795")))
entries_to_remove <- subset(df, entry %in% c("7795"))
> c( 5, 6, 7) == 5
[1]  TRUE FALSE FALSE
> c( 5, 6, 7 , NA) == 5
[1]  TRUE FALSE FALSE    NA
> c( 5, 6, 7 , NA) %in% 5
[1]  TRUE FALSE FALSE FALSE