提问人:confusedindividual 提问时间:4/6/2022 最后编辑:confusedindividual 更新时间:4/7/2022 访问量:220
查找某些行并确定它们是负数还是正数
Finding certain rows and determining if they are negative or positive
问:
我正在尝试做一些非常奇怪的事情。我想根据不同 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
谢谢你所有的回答。 跟进第一个问题:有没有办法从包含的 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
答:
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
这是我的解决方案,而不是.rowMeans
RowSums
#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
添加 和 子集 标签向量。2
sign
rowMeans
考虑这个数据框架,其中“中性”结果也是可能的。
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))
评论
sign(c(-11, 0, 11))
dput(data.frame1)
dput(data.frame2)
rowSums(df1[df2$col_a,]) < 0