我想要每年的百分比,所以每个栏的百分比.我现在的问题是,我必须排除每一行的前两个,因为在这一点上,个人是年轻的,可以纳入我的分析.我try 将前两个更改为NAs,因此我仍然知道有一个,但它未包含在我的分析/计算中.

    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 

我try 了不同的配方.其中大多数根本不起作用.

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

我还try 了以下方法,但出现了一个错误:

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

错误:.predicate的长度必须为1,而不是14.

推荐答案

这是一个基本的方法.

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年3月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年3月17日创建

要以百分比形式打印,请使用软件包scales、函数percent或base 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年3月17日创建

R相关问答推荐

使用log 10转换绘制geom_smooth

使用split.zoo界定xts物体的降水事件

如何判断某列中由某些行组成的百分比

使用spatVector裁剪网格数据时出现的问题

具有多个依赖变量/LHS的逻辑模型

x[[1]]中的错误:脚注越界

用derrr在R中查找组间的重复项

bslib::card_header中的shine::downloadButton,图标而不是文本

如何编辑gMarginal背景以匹配绘图背景?

根据文本字符串中的值粘贴新列

使用整齐的计算(curl -curl )和杂音

在数组索引上复制矩阵时出错

如何在分组条形图中移动相关列?

哪一行和行和 Select 特定行,但是考虑到Nas

悬崖三角洲超大型群数计算导致整数溢出

如何从向量构造一系列双边公式

在使用具有Bray-Curtis相似性的pvCluust时计算p值

在R中使用列表(作为tibble列)进行向量化?

为什么在写入CSV文件时Purrr::Pwalk不起作用

使用R、拼图和可能的网格包绘制两个地块的公共垂直线