通过行循环if语句

时间:2017-09-12 07:06:06

标签: r

我对R很新,所以我问了一个基本问题。

我有两个数据框

数据框1包含匹配对:

Factor1 Factor2
  A       D
  B       E
  C       F

数据框2包含不同样本中不同因子的水平:

  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,则在第三列中将TRUE添加到数据帧1.否则添加FALSE。我希望我的问题很清楚。感谢

Factor1 Factor2 if_match
  A       D       TRUE
  B       E       TRUE
  C       F       FALSE

2 个答案:

答案 0 :(得分:1)

假设两个数据集中的列数相同,请使用match基于将'df2'的rownames与'df1'的每列进行比较来获取行的索引,然后获取第二个数据集的相应列值,检查它是否大于或等于5并将Reduce更改为单个逻辑vector

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 :(得分:1)

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

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子集使用部分匹配,因此例如DF['A',] 'A'会在'A123'中找到row.names(DF)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 。 因此,如果您的数据可能具有部分匹配因素,我建议您改为使用以下代码(如data.frame subset documentation中所述):

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')

重现示例数据的代码:

sparkSession.sql("SELECT DESCRIPTION FROM sample WHERE FROM_USER IN usersSet);