首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >循环if语句遍历各行

循环if语句遍历各行
EN

Stack Overflow用户
提问于 2017-09-12 15:06:06
回答 2查看 33关注 0票数 0

我是R的新手,所以我在问一个基本的问题。

我有两个数据帧

数据帧1包含匹配对:

代码语言:javascript
复制
Factor1 Factor2
  A       D
  B       E
  C       F

数据帧2包含不同样本中不同因素的水平:

代码语言:javascript
复制
  Sample1 Sample2
A   10      0
B   10      0
C   0       0
D   0       10
E   0       10
F   0       0

我正在尝试遍历第一个数据帧。对于数据帧1中的每一行,如果样本1中factor1的电平大于5,并且样本2中因子2的电平大于5,则在数据帧1中添加第三列中的TRUE,否则添加FALSE。我希望我的问题足够清楚。谢谢

代码语言:javascript
复制
Factor1 Factor2 if_match
  A       D       TRUE
  B       E       TRUE
  C       F       FALSE
EN

回答 2

Stack Overflow用户

发布于 2017-09-12 15:16:49

假设两个数据集中的列数相同,通过比较'df2‘的行名和'df1’的每一列的行名,使用match获取行的索引,然后获取第二个数据集对应的列值,检查它是否大于等于5,并将其Reduce到单个逻辑vector

代码语言:javascript
复制
df2$if_match <- Reduce(`|`, Map(function(x, y) y[match(row.names(df2), 
                    x, nomatch = 0)] >=5 , df1, df2))
df2$if_match
#[1]  TRUE  TRUE FALSE
票数 1
EN

Stack Overflow用户

发布于 2017-09-12 15:21:14

假设data.frame 2的row.names等于data.frame 1中的因子,您可以使用row.names子集:

代码语言:javascript
复制
DF1$if_match <- DF2[as.character(DF1$Factor1),'Sample1'] > 5 &
                DF2[as.character(DF1$Factor2),'Sample2'] > 5

> DF1
  Factor1 Factor2 if_match
1       A       D     TRUE
2       B       E     TRUE
3       C       F    FALSE

编辑:

请注意,由row.names设置的data.frame子集使用部分匹配,因此,例如,如果在row.names(DF)中存在'A''A123',则DF['A',]将同时找到它们。

因此,如果您的数据可以有部分匹配因子,我建议您改用以下代码(如data.frame subset documentation中所建议的):

代码语言:javascript
复制
DF1$if_match <- DF2$Sample1[ match(as.character(DF1$Factor1),row.names(DF2)) ] > 5 &
                DF2$Sample2[ match(as.character(DF1$Factor2),row.names(DF2)) ] > 5

重现示例数据的代码:

代码语言:javascript
复制
DF1 <- read.csv(text=
'Factor1,Factor2
A,D
B,E
C,F')

DF2 <- read.csv(text=
'Sample1,Sample2
A,10,0
B,10,0
C,0,0
D,0,10
E,0,10
F,0,0')
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46170037

复制
相关文章

相似问题

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