我有以下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))
答案 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