数据框:如何在不循环的情况下将当前行与其他行进行比较?

时间:2017-08-16 21:14:34

标签: r dataframe

我有以下df和用例,我想在所有行中找到并设置一些符合条件的行。

df <- data.frame(X=c('a','b','c'), Y=c('a','c','d'))
> df
    X   Y
1   a   a
2   b   c
3   c   d

我想找到那些Y值与另一行中的X值相同的行。在上面的示例中,第2行是真的,因为Y = c和第3行有X = c。请注意,第1行不满足条件。

类似的东西:

df$Flag <- find(df, Y == X_in_another_row(df))

6 个答案:

答案 0 :(得分:3)

<强> 1

对于每个Y,我们会检查X中的任何值(同一行除外)是否匹配。

sapply(1:NROW(df), function(i) df$Y[i] %in% df$X[-i])
#[1] FALSE  TRUE FALSE

如果需要索引,请将整个内容包装在which

which(sapply(1:NROW(df), function(i) df$Y[i] %in% df$X[-i]))
#[1] 2

2 (未经过良好测试)

df <- data.frame(X=c('a','b','c'), Y=c('a','c','d'), stringsAsFactors = FALSE)
temp = outer(df$X, df$Y, "==")  #Check equality among values of X and Y
diag(temp) = FALSE              #Set diagonal values as FALSE (for same row)
colSums(temp) > 0
#[1] FALSE  TRUE FALSE

答案 1 :(得分:1)

which(match(df$Y,df$X)!=1:nrow(df))

答案 2 :(得分:1)

我认为这应该有用。

df <- data.frame(X= c(1,2,3,4,5,3,2,1), Y = c(1,2,3,4,5,6,7,8))
which(with(df,  (X %in% Y) & (X != Y)))

如果我们设置stringsasfactors = FALSE

,则在原始data.frame上工作
df <- data.frame(X=c('a','b','c'), Y=c('a','c','d'), stringsAsFactors = F)    
which(with(df,  (X %in% Y) & (X != Y)))

答案 3 :(得分:1)

相当令人费解,但无论如何我都会把它放在这里。即使X中存在重复值,这也应该有效。 例如,使用以下数据框df2

df2 = data.frame(X=c('a','b','c','a','d'), Y=c('a','c','d','e','b'))
  X Y
1 a a
2 b c
3 c d
4 a e
5 d b


## Specifying the same factor levels allows us to get a square matrix 
df2$X = factor(df2$X,levels=union(df2$X,df2$Y))
df2$Y = factor(df2$Y,levels=union(df2$X,df2$Y))
m = as.matrix(table(df2))
valY = rowSums(m)*colSums(m)-diag(m)
which(df2$Y %in% names(valY)[as.logical(valY)])
[1] 1 2 3 5

答案 4 :(得分:1)

基本上您想知道Y是否在X中,但您希望FALSE时条件为X == Y

df$Z <- with(df, (Y != X) & (Y %in% X))

答案 5 :(得分:0)

# Assume you want to use position 4, value 'c', to find all the rows that Y is 'c'
df <- data.frame(X = c('a', 'b', 'd', 'c'),
                 Y = c('a', 'c', 'c', 'd'))


row <- 4 # assume the desire row is position 4

val <- as.character( df[(row),'X'] ) # get the character and turn it into character type

df[df$Y == val,]
# Result
#   X Y
# 2 b c
# 3 d c