【问题标题】:How to make this process concisely? (如何简洁地制作这个过程? (
【发布时间】:2021-09-06 04:39:38
【问题描述】:

这是桌子。

example<-matrix(NA,40,7)
colnames(example)=c("month1","month2","month3","month4","month5","month6","month7")
example[,1]<-rep(c("A","B","C","D","E","F","G","H",NA),len=40)
example[,2]<-rep(c("A","H",NA,"C","E",NA,"F",NA),len=40)
example[,3]<-rep(c("C","A","C",NA),len=40)
example[,4]<-rep(c(NA,"A","F","H","E",NA),len=40)
example[,5]<-rep(c("A",NA),len=40)
example[,6]<-rep(c("C",NA,NA,"E"),len=40)
example[,7]<-rep(c("C","A",NA,NA,"C",NA,"F",NA),len=40)
example<-as.data.frame(example)



example
   month1 month2 month3 month4 month5 month6 month7
1       A      A      C   <NA>      A      C      C
2       B      H      A      A   <NA>   <NA>      A
3       C   <NA>      C      F      A   <NA>   <NA>
4       D      C   <NA>      H   <NA>      E   <NA>
5       E      E      C      E      A      C      C
6       F   <NA>      A   <NA>   <NA>   <NA>   <NA>
7       G      F      C   <NA>      A   <NA>      F
8       H   <NA>   <NA>      A   <NA>      E   <NA>
9    <NA>      A      C      F      A      C      C
10      A      H      A      H   <NA>   <NA>      A
11      B   <NA>      C      E      A   <NA>   <NA>
12      C      C   <NA>   <NA>   <NA>      E   <NA>
13      D      E      C   <NA>      A      C      C
14      E   <NA>      A      A   <NA>   <NA>   <NA>
15      F      F      C      F      A   <NA>      F
16      G   <NA>   <NA>      H   <NA>      E   <NA>
17      H      A      C      E      A      C      C
18   <NA>      H      A   <NA>   <NA>   <NA>      A
19      A   <NA>      C   <NA>      A   <NA>   <NA>
20      B      C   <NA>      A   <NA>      E   <NA>
...

sub<-c("ALL","A","B","C","D","E","F","G","H")

对于“子”变量中的所有组件。 (所有,a,b,c,...,h) 我想制作一个包含字母数量的表格。 比如把month1和month2的值个数放到alltable[1,1]中, 将month2和month3的值个数放入alltable[2,3]

ALLtable<-matrix(NA,13,15)
ALLtable[1,1]<-dim(example %>% select('month1','month1') %>% drop_na('month1'&'month1'))[1]
ALLtable[1,2]<-dim(example %>% select('month1','month2') %>% drop_na('month1'&'month2'))[1]
ALLtable[1,3]<-dim(example %>% select('month1','month3') %>% drop_na('month1'&'month3'))[1]
ALLtable[2,2]<-dim(example %>% select('month2','month2') %>% drop_na('month2'&'month2'))[1]
ALLtable[2,3]<-dim(example %>% select('month2','month3') %>% drop_na('month2'&'month3'))[1]

example %>% select('month1','month3') %>% drop_na('month1') %>% drop_na(month3)
example %>% select('month3','month1') %>% drop_na('month3') %>% drop_na(month1)

ALLtable
      [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12] [,13] [,14] [,15]
 [1,]   36   22   27   NA   NA   NA   NA   NA   NA    NA    NA    NA    NA    NA    NA
 [2,]   22   25   NA   NA   NA   NA   NA   NA   NA    NA    NA    NA    NA    NA    NA
 [3,]   27   NA   NA   NA   NA   NA   NA   NA   NA    NA    NA    NA    NA    NA    NA
 [4,]   NA   NA   NA   NA   NA   NA   NA   NA   NA    NA    NA    NA    NA    NA    NA
 [5,]   NA   NA   NA   NA   NA   NA   NA   NA   NA    NA    NA    NA    NA    NA    NA
 [6,]   NA   NA   NA   NA   NA   NA   NA   NA   NA    NA    NA    NA    NA    NA    NA
 [7,]   NA   NA   NA   NA   NA   NA   NA   NA   NA    NA    NA    NA    NA    NA    NA
 [8,]   NA   NA   NA   NA   NA   NA   NA   NA   NA    NA    NA    NA    NA    NA    NA
 [9,]   NA   NA   NA   NA   NA   NA   NA   NA   NA    NA    NA    NA    NA    NA    NA
[10,]   NA   NA   NA   NA   NA   NA   NA   NA   NA    NA    NA    NA    NA    NA    NA

把column1中'A'值的个数和column2中所有值的个数 进入表[1,2] 将 column1 中的“A”值的数量和 column3 中所有值的数量 进入 Atable[1,3] 之类的

Atable<-matrix(NA,13,15)
Atable[1,1]<-dim(example %>% select(month1,month1) %>% filter(month1=='A') %>% drop_na(month1,month1))[1]
Atable[1,2]<-dim(example %>% select(month1,month2) %>% filter(month1=='A') %>% drop_na(month1,month2))[1]
Atable[1,3]<-dim(example %>% select(month1,month3) %>% filter(month1=='A') %>% drop_na(month1,month3))[1]
Atable[2,2]<-dim(example %>% select(month2,month2) %>% filter(month2=='A') %>% drop_na(month2,month2))[1]
Atable[2,3]<-dim(example %>% select(month2,month3) %>% filter(month2=='A') %>% drop_na(month2,month3))[1]

Atable
      [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12] [,13] [,14] [,15]
 [1,]    5    4    4   NA   NA   NA   NA   NA   NA    NA    NA    NA    NA    NA    NA
 [2,]   NA    5    5   NA   NA   NA   NA   NA   NA    NA    NA    NA    NA    NA    NA
 [3,]   NA   NA   NA   NA   NA   NA   NA   NA   NA    NA    NA    NA    NA    NA    NA
 [4,]   NA   NA   NA   NA   NA   NA   NA   NA   NA    NA    NA    NA    NA    NA    NA
 [5,]   NA   NA   NA   NA   NA   NA   NA   NA   NA    NA    NA    NA    NA    NA    NA
 [6,]   NA   NA   NA   NA   NA   NA   NA   NA   NA    NA    NA    NA    NA    NA    NA

我想轻松自动地完成这个过程。 我可以使用 eval(parse(text= function 和 for 循环, 我认为有很多更容易的方式。

感谢您的帮助。

【问题讨论】:

  • Atable[1,.] 中,您使用month1 过滤了列,而不使用month2 等。但在Atable[2,3] 中,month3 过滤了列。你能告诉我过滤过程的确切属性吗?
  • @Park 哦,我输入了错误的代码,Atable[2,3] 必须使用过滤器 month2 而不是 month3

标签: r for-loop automation


【解决方案1】:

您可以使用colSums 在每一列中查找非 NA 值并将其分配给矩阵的对角线。使用combn 获取每个组合的非 NA 值。

#column names
cols <- names(example)
#Assign the diagonal values
mat <- diag(colSums(!is.na(example)))
#For every combination of 2 columns fill the lower triangle of the matrix
mat[lower.tri(mat)] <- combn(cols, 2, function(x) nrow(na.omit(example[x])))
#Copy the value from lower triangle to upper triangle
mat[upper.tri(mat)] <- t(mat)[upper.tri(mat)]
#assign the names. 
dimnames(mat) <- list(cols, cols)
mat

#       month1 month2 month3 month4 month5 month6 month7
#month1     36     22     27     25     18     18     18
#month2     22     25     20     16     15     15     20
#month3     27     20     30     20     20     10     20
#month4     25     16     20     27     13     13     13
#month5     18     15     20     13     20     10     15
#month6     18     15     10     13     10     20     10
#month7     18     20     20     13     15     10     20

【讨论】:

    【解决方案2】:

    根据您的情况,

    cols <- names(example)
    mon <- lapply(sub, function(xx) {
      if (xx == "ALL"){
        mat <- diag(colSums(!is.na(example)))
        mat[lower.tri(mat)] <- combn(cols, 2, function(x) nrow(na.omit(example[x])))
        mat[upper.tri(mat)] <- t(mat)[upper.tri(mat)]
        dimnames(mat) <- list(cols, cols)
        mat
      } else {
        mat <- diag(colSums(example == xx, na.rm = TRUE))
        mat[lower.tri(mat)] <- combn(cols, 2, function(x) sum((na.omit(example[x])[1]) == xx))
        mat[upper.tri(mat)] <- t(mat)[upper.tri(mat)]
        mat[lower.tri(mat)] <- combn(cols, 2, function(x) sum((na.omit(example[x])[2]) == xx))
        dimnames(mat) <- list(cols, cols)
        mat
        }
    })
    
    names(mon) <- sub
    

    现在mon 就是您想要的。例如,mon[['A']] 将返回

           month1 month2 month3 month4 month5 month6 month7
    month1      5      4      4      2      3      3      3
    month2      4      5      5      3      5      5      5
    month3      9      5     10      7      0      0      5
    month4      7      3      4      7      0      3      2
    month5     18     15     20     13     20     10     15
    month6      0      0      0      0      0      0      0
    month7      4      5      5      4      0      0      5
    

    在你的问题中是Atable

    【讨论】:

      猜你喜欢
      • 2011-04-22
      • 1970-01-01
      • 2011-06-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-11
      • 2022-01-28
      • 1970-01-01
      相关资源
      最近更新 更多