查找某些行并确定它们是负数还是正数

Finding certain rows and determining if they are negative or positive

提问人:confusedindividual 提问时间:4/6/2022 最后编辑:confusedindividual 更新时间:4/7/2022 访问量:220

问:

我正在尝试做一些非常奇怪的事情。我想根据不同 data.frame 的列中的行号以某种方式确定单独 data.frame 的行主要是负数还是正数......我已经包含了我的示例数据帧(data.frame1 和 data.frame2)和所需的输出

>data.frame1
     col_a col_b  col_c
 1   1     1       1
 2   1    -1      -1 
 3   1     1       1 
 4  -1    -1      -1 
 5   1     1      -1

>data.frame2
   col_a
1    2
2    3
3    5


Example output/result 
     col_a     col_b
1      2     negative
2      3     positive
3      5     positive

另一个示例输出可能是

Example 2 output/result 
     col_a  col_b
1      2    -1
2      3     1
3      5     1

Dataframe1

datafram2 enter image description here enter image description here

谢谢你所有的回答。 跟进第一个问题:有没有办法从包含的 ID 列中获取包含测量值的输出?请参阅下面的示例数据框和所需输出

 >data.frame1
       ID    col_a col_b  col_c
 1   Fish1   1     1       1
 2   Fish1   1    -1      -1 
 3   Fish1   1     1       1 
 4   Fish1  -1    -1      -1 
 5   Fish1   1     1      -1

>data.frame2
   col_a
1    2
2    3
3    5


Example output/result 
    ID   col_a     col_b
1  Fish1    2     -1
2  Fish1    3      1
3  Fish1    5      1
r

评论

0赞 zx8754 4/6/2022
阅读有关标志的信息:sign(c(-11, 0, 11))
0赞 Sandwichnick 4/6/2022
您能否给我们一种简单的方法来重现您的问题,方法是给我们 和 的打印输出?dput(data.frame1)dput(data.frame2)
1赞 Sotos 4/6/2022
你可以从类似的东西开始,把它变成你想要的格式rowSums(df1[df2$col_a,]) < 0

答:

2赞 zx8754 4/6/2022 #1

根据第二个数据帧对第一个数据帧行进行子集,然后检查符号,然后获取行的总和,然后再次获取符号

cbind(data.frame2,
      result = sign(rowSums(sign(data.frame1[ data.frame2$col_a, ]))))
#   col_a result
# 1     2     -1
# 2     3      1
# 3     5      1

注意:如果第一个数据帧只有值 -1 和 1,那么我们可以删除内部符号步骤:

sign(rowSums(data.frame1[ data.frame2$col_a, ]))
2赞 Sandwichnick 4/6/2022 #2

这是我的解决方案,而不是.rowMeansRowSums

#making the example
df1 <- data.frame("a" = c(1,1,1,-1,1),
                  "b" = c(1,-1,1,-1,1),
                  "c"=  c(1,-1,1,-1,-1))

df2 <- data.frame("col_a" = c(2,3,5))

# Check if all indices of rows in d2 are in df1
stopifnot(all(df2$col_a %in% c(1:nrow(df1))))

# no second sign to get a logical value
df2$col_b <- rowMeans(sign(df1[df2$col_a,])) >= 0

# make to factor
df2$col_b <- ifelse(df2$col_b,"positive","negative")

评论

0赞 zx8754 4/6/2022
我们假设 0 是负数吗? 与sign(mean(c(-1, -1, 1, 1)))mean(c(-1, -1, 1, 1)) > 0
0赞 Sandwichnick 4/6/2022
sign(0) == 0,因此我不能确定 R 如何看待它。我编辑了我的答案,将 0 定义为正数。
2赞 zx8754 4/6/2022
现在我们假设 0 是正:)它既不是积极的,也不是消极的。无论如何,很好地使用了 rowMeans。让我们留给OP来决定。
1赞 jay.sf 4/6/2022 #3

添加 和 子集 标签向量。2signrowMeans

考虑这个数据框架,其中“中性”结果也是可能的。

d1
#   col_a col_b col_c col_d
# 1     1     1     1     1
# 2     1    -1    -1     1
# 3     1     1     1     1
# 4    -1    -1    -1    -1
# 5     1     1    -1     1
# 6     1    -1    -1    -1

在我使用完整的子集进行演示。d2

d2 |> 
  transform(res=c('negative', 'neutral', 'positive')[
    sign(rowMeans(d1[d2$col_a, ])) + 2])
#   col_a      res
# 1     1 positive
# 2     2  neutral
# 3     3 positive
# 4     4 negative
# 5     5 positive
# 6     6 negative

数据:

d1 <- structure(list(col_a = c(1L, 1L, 1L, -1L, 1L, 1L), col_b = c(1L, 
-1L, 1L, -1L, 1L, -1L), col_c = c(1L, -1L, 1L, -1L, -1L, -1L), 
    col_d = c(1L, 1L, 1L, -1L, 1L, -1L)), class = "data.frame", row.names = c("1", 
"2", "3", "4", "5", "6"))

d2 <- structure(list(col_a = 1:6), class = "data.frame", row.names = c(NA, 
-6L))