有条件地计算R列中的值数量,第2部分

有条件地计算R列中的值数量,第2部分,r,aggregate,apply,R,Aggregate,Apply,我有三个向量: x <- c(1,1,1,1,1, 2,2,2,3,3, 3,3,3,4,4, 5,5,5,5,5 ) y <- c(2,2,1,3,2, 1,4,2,2,NA, 3,3,3,4,NA, 1,4,4,2,NA) w <- c(1,45,NA,45,NA,45,41,45,96,25,12,NA,7,NA,4,45,12,45,32,56) 在这里,您可以使用xtabs汇总w不为NA的值 dd<-as.data.frame(xtabs(!is.na(

我有三个向量:

x <- c(1,1,1,1,1, 2,2,2,3,3,  3,3,3,4,4,  5,5,5,5,5 )
y <- c(2,2,1,3,2, 1,4,2,2,NA, 3,3,3,4,NA, 1,4,4,2,NA)
w <- c(1,45,NA,45,NA,45,41,45,96,25,12,NA,7,NA,4,45,12,45,32,56)

在这里,您可以使用xtabs汇总
w
不为NA的值

 dd<-as.data.frame(xtabs(!is.na(w)~y+x), stringsAsFactors=F)
然后用

dd <- dd[order(-dd$y,dd$x),]

dd这里有一个使用
dplyr的解决方案

library(dplyr)
dat <- data.frame(
  x = c(1,1,1,1,1, 2,2,2,3,3,  3,3,3,4,4,  5,5,5,5,5 ),
  y = c(2,2,1,3,2, 1,4,2,2,NA, 3,3,3,4,NA, 1,4,4,2,NA),
  w = c(1,45,NA,45,NA,45,41,45,96,25,12,NA,7,NA,4,45,12,45,32,56)
) 

dat %>%
  filter(!is.na(w)) %>%
  filter(!is.na(y)) %>%
  group_by(y,x) %>%
  summarise(result = n())

   y x result
1  1 2      1
2  1 5      1
3  2 1      2
4  2 2      1
5  2 3      1
6  2 5      1
7  3 1      1
8  3 3      2
9  4 2      1
10 4 5      2

如果x和y的因子组合不存在,此技术将为您提供NA“结果”

谢谢!但是如何使用NA在结果中显示行。您有10行,但如何使所有20行?使y从4变为1,但nit从1变为4。已编辑!简单的回答是:使用
expand.grid
创建所有需要的行,然后使用
arrange
Hi对结果重新排序。您知道如何按组x和y进行相同的计算,但按子组分割x:如果0y+I(x)代替
y+x
,你能看看我在这里贴的那个问题吗
dd <- dd[order(-dd$y,dd$x),]
library(dplyr)
dat <- data.frame(
  x = c(1,1,1,1,1, 2,2,2,3,3,  3,3,3,4,4,  5,5,5,5,5 ),
  y = c(2,2,1,3,2, 1,4,2,2,NA, 3,3,3,4,NA, 1,4,4,2,NA),
  w = c(1,45,NA,45,NA,45,41,45,96,25,12,NA,7,NA,4,45,12,45,32,56)
) 

dat %>%
  filter(!is.na(w)) %>%
  filter(!is.na(y)) %>%
  group_by(y,x) %>%
  summarise(result = n())

   y x result
1  1 2      1
2  1 5      1
3  2 1      2
4  2 2      1
5  2 3      1
6  2 5      1
7  3 1      1
8  3 3      2
9  4 2      1
10 4 5      2
foo <- dat %>%
  filter(!is.na(w)) %>%
  filter(!is.na(y)) %>%
  group_by(y,x) %>%
  summarise(result = sum(!is.na(w)))

with(dat, expand.grid(x = unique(x),
                      y = unique(y))) %>%
  filter(!is.na(y)) %>%
  left_join(foo) %>%
  arrange(desc(y))

   x y result
1  1 4     NA
2  2 4      1
3  3 4     NA
4  4 4     NA
5  5 4      2
6  1 3      1
7  2 3     NA
8  3 3      2
9  4 3     NA
10 5 3     NA
11 1 2      2
12 2 2      1
13 3 2      1
14 4 2     NA
15 5 2      1
16 1 1     NA
17 2 1      1
18 3 1     NA
19 4 1     NA
20 5 1      1