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 的比例,请使用 colMeans
和 na.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 创建
我想要每一年的百分比,所以每一列的百分比。我现在的问题是,我必须排除每行的前两个,因为那时个人太年轻了,无法纳入我的分析。我试图将前两个改成 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 的比例,请使用 colMeans
和 na.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 创建