基于列号的条件子集

时间:2017-05-31 18:54:21

标签: r function subset

我需要在列不匹配时对数据进行子集化。例如,如果我在第一列X中有一个标识符,如1,那么Y列中的所有以下示例都应该匹配:

X <- rep(1:4, times=2, each=2)
Y <- rep(c("Dave","Sam","Sam","Sam"))
Z <- as.data.frame(cbind(X,Y))
head(Z)

所以在这个例子中我希望在这个例子中X = 1和3时对数据进行子集化,因为列y并不完全同意非子集列2.将函数设置为子集是很好的。我在更大的数据帧上遇到的这类问题

谢谢,

3 个答案:

答案 0 :(得分:1)

dplyr

df <- data.frame(x = rep(1:4, times=2, each=2),
                 y = rep(c("Dave","Sam","Sam","Sam")))

library(dplyr)

df %>% 
  group_by(x) %>% 
  filter(any(!y == lag(y), na.rm = T))

#> Source: local data frame [8 x 2]
#> Groups: x [2]
#> 
#>       x      y
#>   <int> <fctr>
#> 1     1   Dave
#> 2     1    Sam
#> 3     3   Dave
#> 4     3    Sam
#> 5     1   Dave
#> 6     1    Sam
#> 7     3   Dave
#> 8     3    Sam

我测试了一些案例,不确定这是否包含很多边缘案例

答案 1 :(得分:0)

这是我的方式,虽然可能有更优雅的方式。这是你需要的吗?

X <- rep(1:4, times=2, each=2)
Y <- rep(c("Dave","Sam","Sam","Sam"))
Z <- as.data.frame(cbind(X,Y))
head(Z)

# First Create Concatenated column
Z$XY <- paste(Z$X, Z$Y)

# Eliminate all duplicates
Z_unique <- unique(Z)

# Find number of occurences of each X value
n_occur <- data.frame(table(Z_unique$X))

# Pull only those that have occurred more than once
n_occur[n_occur$Freq > 1,]

# Subset the output to only those values
output <- Z[Z$X %in% n_occur$Var1[n_occur$Freq > 1],]

答案 2 :(得分:0)

我们可以使用data.table

library(data.table)
setDT(df)[, .SD[any(!y == shift(y))], x]
#   x    y
#1: 1 Dave
#2: 1  Sam
#3: 1 Dave
#4: 1  Sam
#5: 3 Dave
#6: 3  Sam
#7: 3 Dave
#8: 3  Sam

数据

df <- data.frame(x = rep(1:4, times=2, each=2),
              y = rep(c("Dave","Sam","Sam","Sam")))