从两个数据帧创建-1,0,1矩阵

时间:2017-05-30 01:43:15

标签: r matrix

我想为表达式数据创建一个值为-1,0和1的矩阵。我遇到的问题是数据在两个独立的数据框中,一个包含过表达而另一个包含不足。我想将它们组合到同一列中,其中过度表达的术语显示“1”,表达式下方为“-1”,并且没有更改为“0”。

>over
0.09
0.08
0.02
0.10
0.07
>under
0.07
0.03
0.06
0.01
0.02

所以我希望一个矩阵在1中为over提供<0.05,在-1中提供<{1}} <0.05;

under

尝试了几件不同的事情,但不断碰壁,无法找到类似问题的具体内容。

4 个答案:

答案 0 :(得分:4)

它只是几个基本任务:

# recreate your data
over  <- c(0.09,0.08,0.02,0.10,0.07)
under <- c(0.07,0.03,0.06,0.01,0.02)

out <- vector("numeric",5)
out[over  < 0.05] <-  1
out[under < 0.05] <- -1
out
#[1]  0 -1  1 -1 -1

或使用interaction检查多个条件的简写。这样做的另一个好处是可以处理符合这两个标准的案例并将其标记为这样。它还允许任意标记。

c(0,1,-1,2)[interaction(over < 0.05, under < 0.05)]
#[1]  0 -1  1 -1 -1

答案 1 :(得分:2)

您可以直接在每个数据框上使用比较,并将它们视为数字。这将导致只有0或1个值。

<% @posts.each do |post|%>
       <%- if post.followers.where(user_id: current_user.id).any?%>
          <div class="btn btn-default pull-right" style="margin-top:-100px;">
            <i class="fa fa-thumbs-up" aria-hidden="true"></i>
          </div>
        <% else %>
          <div class="btn btn-default pull-right" style="margin-top:-100px;">
            <i class="fa fa-thumbs-o-up" aria-hidden="true"></i>
          </div>
        <% end %>
<% end %>

数据:

mat <- as.matrix(as.numeric(df1$over < 0.05) -
       as.numeric(df2$under < 0.05))
> mat
      [,1]
[1,]    0
[2,]   -1
[3,]    1
[4,]   -1
[5,]   -1

在这里演示:

Rextester

答案 2 :(得分:0)

我确信有比这更优雅的方法,但你可以将列绑定在一起,创建一个填充0的new列,测试“over”和“under”条件然后转换{{ 1}}列到矩阵,全部使用new。当然,如果两个条件都可以为真,那么第二个测试将覆盖第一个测试的结果。

dplyr

答案 3 :(得分:0)

我们也可以在不转换为numeric

的情况下执行此操作
new <- (df1$over < 0.05) - (df2$under < 0.05)
dim(new) <- dim(df1)
new
#      [,1]
#[1,]    0
#[2,]   -1
#[3,]    1
#[4,]   -1
#[5,]   -1

或另一种选择是

matrix(Reduce(`-`, lapply(cbind(df1, df2), `<`, 0.05)))