首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >数据帧:如何将当前行与其他行进行比较而不进行循环?

数据帧:如何将当前行与其他行进行比较而不进行循环?
EN

Stack Overflow用户
提问于 2017-08-16 21:14:33
回答 6查看 80关注 0票数 3

我有下面的df和用例,我想在所有行中找到并设置一些东西,这些行存在另一个满足条件的行。

代码语言:javascript
运行
复制
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行不满足条件。

类似于:

代码语言:javascript
运行
复制
df$Flag <- find(df, Y == X_in_another_row(df))
EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2017-08-16 21:39:45

1

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

代码语言:javascript
运行
复制
sapply(1:NROW(df), function(i) df$Y[i] %in% df$X[-i])
#[1] FALSE  TRUE FALSE

如果需要索引,请将整个过程包装在which

代码语言:javascript
运行
复制
which(sapply(1:NROW(df), function(i) df$Y[i] %in% df$X[-i]))
#[1] 2

2 (测试不佳)

代码语言:javascript
运行
复制
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
票数 3
EN

Stack Overflow用户

发布于 2017-08-16 21:30:19

代码语言:javascript
运行
复制
which(match(df$Y,df$X)!=1:nrow(df))
票数 1
EN

Stack Overflow用户

发布于 2017-08-16 21:55:50

我觉得这个应该管用。

代码语言:javascript
运行
复制
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)))

在原始data.frame上工作,如果我们设置了stringsasfactors=FALSE

代码语言:javascript
运行
复制
df <- data.frame(X=c('a','b','c'), Y=c('a','c','d'), stringsAsFactors = F)    
which(with(df,  (X %in% Y) & (X != Y)))
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45723103

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档