使用R,part2条件计算列中值的数量

时间:2014-06-20 16:15:58

标签: 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)

如何找到每个X(从1到5)和每个Y(从1到4)的W(不计算NA)值的数量?

输出应采用以下格式:

y x  result
4 1   ...
4 2   ...
4 3
4 4
4 5
3 1
3 2
3 3
3 4
3 5
...
1 1
1 2
1 3
1 4 
1 5

2 个答案:

答案 0 :(得分:1)

在这里,您可以使用xtabs来总结w不是NA

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

as.data.frame部分根据需要将其从表格更改为长格式。唯一的问题是,xtabs会将xy转换为字符。您可以使用

将它们转换回数字
dd$x <- as.numeric(dd$x)
dd$y <- as.numeric(dd$y)

然后按

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

答案 1 :(得分:0)

以下是使用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

上述内容仅为wx的所有非NA级别提供了y的非NA值数量 如果您想查看所有组合的非基准级别xy,您可以先使用expand.grid

进行初始化
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

这项技术可以为你提供NA&#34;结果&#34;只要x和y的因子组合不存在