有条件地计算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