R - 将每行中变量的前两次更改为 NA

R - change the first two times of a variable in each row into NAs

我想要每一年的百分比,所以每一列的百分比。我现在的问题是,我必须排除每行的前两个,因为那时个人太年轻了,无法纳入我的分析。我试图将前两个改成 NA,所以我仍然知道有一个,但它没有包含在我的 analysis/calculations 中。 我的数据集 (df) 的前六行如下所示:

    2007 2008 2009 2010 2011 2012 2013 2014
   1    1    1    1    1   1     1    1    1
   2    0    1    1    1   0     0    0    0
   3    1    1    1    1   1     1    1    1
   4    1    1    1    0   0     0    0    0
   5    0    1    1    1   0     0    0    0
   6    1    1    1    1   1     1    1    1 

数据集应如下所示 |预期输出:

  2007 2008 2009 2010 2011 2012 2013 2014
 1  NA   NA    1    1   1     1    1    1
 2  0    NA   NA    1   0     0    0    0
 3  NA   NA    1    1   1     1    1    1
 4  NA   NA    1    0   0     0    0    0
 5  0    NA   NA    1   0     0    0    0
 6  NA   NA    1    1   1     1    1    1 

我尝试了不同的配方。他们中的大多数人根本没有工作。 以下代码至少有效但没有对我的数据集进行任何更改。任何帮助将不胜感激。

 df2 <- df %>% 
  transmute(across(.cols = everything(), .fns = NULL, 
                   (length(x<-which(myRow == 1)) == length(x+1)), NA))

我也尝试了以下但出现错误:

 df3 <- transmute_if (df,(length(x<-which(myRow == 1)) == length(x+1)), return(NA))

Error: .predicate must have length 1, not 14.

这是基本的 R 方式。

df1 <- read.table(text = "
2007 2008 2009 2010 2011 2012 2013 2014
   1    1    1    1    1   1     1    1    1
   2    0    1    1    1   0     0    0    0
   3    1    1    1    1   1     1    1    1
   4    1    1    1    0   0     0    0    0
   5    0    1    1    1   0     0    0    0
   6    1    1    1    1   1     1    1    1
", header = TRUE, check.names = FALSE)

f <- function(x){
  i <- which(x == 1)
  if(length(i) ==  1L) {
    is.na(x) <- i
  } else if (length(i >= 2L)) {
    is.na(x) <- i[1:2]
  }
  x
}
t(apply(df1, 1, f))
#>   2007 2008 2009 2010 2011 2012 2013 2014
#> 1   NA   NA    1    1    1    1    1    1
#> 2    0   NA   NA    1    0    0    0    0
#> 3   NA   NA    1    1    1    1    1    1
#> 4   NA   NA    1    0    0    0    0    0
#> 5    0   NA   NA    1    0    0    0    0
#> 6   NA   NA    1    1    1    1    1    1

reprex package (v2.0.1)

于 2022-03-15 创建

编辑

要获得每年 1 的比例,请使用 colMeansna.rm = TRUE

df2 <- t(apply(df1, 1, f))
colMeans(df2, na.rm = TRUE)
#>      2007      2008      2009      2010      2011      2012      2013      2014 
#> 0.0000000       NaN 1.0000000 0.8333333 0.5000000 0.5000000 0.5000000 0.5000000

reprex package (v2.0.1)

于 2022-03-17 创建

并以百分比形式打印使用包 scales、函数 percent 或基础 R sprintf.

scales::percent(colMeans(df2, na.rm = TRUE), accuracy = 0.01)
#>      2007      2008      2009      2010      2011      2012      2013      2014 
#>   "0.00%"        NA "100.00%"  "83.33%"  "50.00%"  "50.00%"  "50.00%"  "50.00%"
sprintf("%2.4g%%", 100*colMeans(df2, na.rm = TRUE))
#> [1] " 0%"    "NaN%"   "100%"   "83.33%" "50%"    "50%"    "50%"    "50%"

reprex package (v2.0.1)

于 2022-03-17 创建