如何使用 sapply 保留所有变量?
How to keep all variables using sapply?
我有一个表(EU_28),表头是这样的:
# A tibble: 5 x 22
`Member State` `1997` `1998` `1999` `2000` `2001` `2002` `2003` `2004` `2005` `2006` `2007`
<chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 Belgium 161621 171026 165557 179381 174181 173824 181110 187889 206539 218941 236320
2 Bulgaria NA NA NA NA 20192 20390 21358 23125 24841 27513 24900
3 Croatia NA NA NA 16886 19056 18584 20320 25246 26201 26325 30097
4 Cyprus NA NA NA NA NA 7220 7258 6837 7305 7676 7516
5 Denmark 124010 104966 97213 96533 93972 94283 103954 100373 99688 107674 109660
# ... with 10 more variables: `2008` <dbl>, `2009` <dbl>, `2010` <dbl>, `2011` <dbl>,
# `2012` <dbl>, `2013` <dbl>, `2014` <dbl>, `2015` <dbl>, `2016` <dbl>, `2017` <dbl>
我想转换除第一个变量 'Member State' 之外的每一行的每个变量('000 吨)的数值,方法是将每个变量除以 1000 以转换为 'millions of tonnes'.
到目前为止,我已尝试将 sapply() 与我自己的函数结合使用来转换每一列。
首先我创建了一个'convert_to_millions'函数:
convert_to_millions <- function(x){x/1000}
然后我使用 sapply():
将其应用于 EU_28
EU_28_Mtonnes <- tbl_df(sapply(EU_28, convert_to_millions))
Error in x/1000 : non-numeric argument to binary operator
Called from: FUN(X[[i]], ...)
这引发了一个我不明白的错误,所以我尝试仅将 sapply() 应用于我的 tbl 的数字变量:
EU_28_Mtonnes <- tbl_df(sapply(EU_28[,2:length(EU_28)], convert_to_millions))
> head(EU_28_Mtonnes)
# A tibble: 6 x 21
`1997` `1998` `1999` `2000` `2001` `2002` `2003` `2004` `2005` `2006` `2007` `2008` `2009`
<dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 162. 171. 166. 179. 174. 174. 181. 188. 207. 219. 236. 244. 203.
2 NA NA NA NA 20.2 20.4 21.4 23.1 24.8 27.5 24.9 26.6 21.9
3 NA NA NA 16.9 19.1 18.6 20.3 25.2 26.2 26.3 30.1 29.2 23.4
4 NA NA NA NA NA 7.22 7.26 6.84 7.30 7.68 7.52 7.96 6.81
5 124. 105. 97.2 96.5 94.0 94.3 104. 100. 99.7 108. 110. 106. 90.6
6 NA NA NA NA 40.4 44.7 47.0 44.8 46.5 50.0 45.0 36.2 38.5
# ... with 8 more variables: `2010` <dbl>, `2011` <dbl>, `2012` <dbl>, `2013` <dbl>,
# `2014` <dbl>, `2015` <dbl>, `2016` <dbl>, `2017` <dbl>
我成功地根据需要转换了每个变量,但我丢失了第一个关键变量 'Member State'。
如何在使用 sapply() 时保留第一个变量?这甚至是一开始使用的正确方法吗?
可以在dplyr中使用mutate_if
指定只对满足一定条件的变量进行转换(比如是数字):
iris %>% mutate_if(is.numeric,funs(./1000))
Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1 0.0051 0.0035 0.0014 0.0002 setosa
2 0.0049 0.0030 0.0014 0.0002 setosa
3 0.0047 0.0032 0.0013 0.0002 setosa
...
我有一个表(EU_28),表头是这样的:
# A tibble: 5 x 22
`Member State` `1997` `1998` `1999` `2000` `2001` `2002` `2003` `2004` `2005` `2006` `2007`
<chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 Belgium 161621 171026 165557 179381 174181 173824 181110 187889 206539 218941 236320
2 Bulgaria NA NA NA NA 20192 20390 21358 23125 24841 27513 24900
3 Croatia NA NA NA 16886 19056 18584 20320 25246 26201 26325 30097
4 Cyprus NA NA NA NA NA 7220 7258 6837 7305 7676 7516
5 Denmark 124010 104966 97213 96533 93972 94283 103954 100373 99688 107674 109660
# ... with 10 more variables: `2008` <dbl>, `2009` <dbl>, `2010` <dbl>, `2011` <dbl>,
# `2012` <dbl>, `2013` <dbl>, `2014` <dbl>, `2015` <dbl>, `2016` <dbl>, `2017` <dbl>
我想转换除第一个变量 'Member State' 之外的每一行的每个变量('000 吨)的数值,方法是将每个变量除以 1000 以转换为 'millions of tonnes'.
到目前为止,我已尝试将 sapply() 与我自己的函数结合使用来转换每一列。
首先我创建了一个'convert_to_millions'函数:
convert_to_millions <- function(x){x/1000}
然后我使用 sapply():
将其应用于 EU_28EU_28_Mtonnes <- tbl_df(sapply(EU_28, convert_to_millions))
Error in x/1000 : non-numeric argument to binary operator
Called from: FUN(X[[i]], ...)
这引发了一个我不明白的错误,所以我尝试仅将 sapply() 应用于我的 tbl 的数字变量:
EU_28_Mtonnes <- tbl_df(sapply(EU_28[,2:length(EU_28)], convert_to_millions))
> head(EU_28_Mtonnes)
# A tibble: 6 x 21
`1997` `1998` `1999` `2000` `2001` `2002` `2003` `2004` `2005` `2006` `2007` `2008` `2009`
<dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 162. 171. 166. 179. 174. 174. 181. 188. 207. 219. 236. 244. 203.
2 NA NA NA NA 20.2 20.4 21.4 23.1 24.8 27.5 24.9 26.6 21.9
3 NA NA NA 16.9 19.1 18.6 20.3 25.2 26.2 26.3 30.1 29.2 23.4
4 NA NA NA NA NA 7.22 7.26 6.84 7.30 7.68 7.52 7.96 6.81
5 124. 105. 97.2 96.5 94.0 94.3 104. 100. 99.7 108. 110. 106. 90.6
6 NA NA NA NA 40.4 44.7 47.0 44.8 46.5 50.0 45.0 36.2 38.5
# ... with 8 more variables: `2010` <dbl>, `2011` <dbl>, `2012` <dbl>, `2013` <dbl>,
# `2014` <dbl>, `2015` <dbl>, `2016` <dbl>, `2017` <dbl>
我成功地根据需要转换了每个变量,但我丢失了第一个关键变量 'Member State'。
如何在使用 sapply() 时保留第一个变量?这甚至是一开始使用的正确方法吗?
可以在dplyr中使用mutate_if
指定只对满足一定条件的变量进行转换(比如是数字):
iris %>% mutate_if(is.numeric,funs(./1000))
Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1 0.0051 0.0035 0.0014 0.0002 setosa
2 0.0049 0.0030 0.0014 0.0002 setosa
3 0.0047 0.0032 0.0013 0.0002 setosa
...