[英]How do I apply an ifelse function to all cells in a data frame?
我正在尝试将 ifelse 语句应用于数据框中的所有单元格。 我很确定我想多了,但希望得到一些帮助/指导!
我有一个来自多个站点的植被覆盖率(稍作修改)的数据框,其中站点名称和植被类型分别是行名称和列名称(即数据框应仅包含数值):
dwarf shrub equisetum forb fungi graminoid lichen moss shrub-forb tall shrub tree
site1 33.25 0 21.25 1.0 35.25 3.25 60.00 0.00 34.25 0.25
site2 30.25 0 15.00 0.0 25.75 7.50 62.25 1.50 26.75 0
site3 50.00 0 10.00 0.5 23.50 3.25 65.00 6.75 18.50 0
site4 46.00 0 7.75 0.0 32.75 2.25 33.75 4.50 11.25 0.75
site5 28.00 0 11.00 0.0 40.00 6.00 30.00 0.00 38.00 0
site6 40.25 0 10.50 0.0 5.75 6.25 7.25 3.25 8.75 1.25
我试图将数字四舍五入到最接近的整数,以便在值大于 1 时使用 round() 函数,在值小于 1 时使用天花板 () 函数。
这是我为尝试执行此操作而编写的代码:
new.df <- if(old.df > 1){
round(old.df, digits = 0)} else{
ceiling(old.df)
}
我也试过没有天花板功能:
new.df <- if(old.df > 1){
round(old.df, digits = 0)} else{
old.df == 1
}
我没有成功应用语句的后半部分 (ceiling())。 我收到此错误:
Warning message:
In if (old.df > 1) { :
the condition has length > 1 and only the first element will be used
任何帮助将不胜感激,谢谢!
您提到了ifelse
,我认为使用lapply
将其应用于每一列是很lapply
。 (如果数据中存在非数字列,我将添加isnum
检查,如果您的数据始终为numeric
,请随意忽略它。)
isnum <- sapply(dat, is.numeric)
dat[isnum] <- lapply(dat[isnum], function(x) ifelse(x > 1, ceiling(x), round(x, 0)))
dat
# dwarf_shrub equisetum forb fungi graminoid lichen moss shrub_forb tall shrub tree
# 1 site1 34 0 22 1 36 4 60 0 35 0
# 2 site2 31 0 15 0 26 8 63 2 27 0
# 3 site3 50 0 10 0 24 4 65 7 19 0
# 4 site4 46 0 8 0 33 3 34 5 12 1
# 5 site5 28 0 11 0 40 6 30 0 38 0
# 6 site6 41 0 11 0 6 7 8 4 9 2
数据:我不得不重命名某些列,因为您的某些列名不容易读入(空格、连字符)。
dat <- read.table(header = TRUE, stringsAsFactors = FALSE, text = "
dwarf_shrub equisetum forb fungi graminoid lichen moss shrub_forb tall shrub tree
site1 33.25 0 21.25 1.0 35.25 3.25 60.00 0.00 34.25 0.25
site2 30.25 0 15.00 0.0 25.75 7.50 62.25 1.50 26.75 0
site3 50.00 0 10.00 0.5 23.50 3.25 65.00 6.75 18.50 0
site4 46.00 0 7.75 0.0 32.75 2.25 33.75 4.50 11.25 0.75
site5 28.00 0 11.00 0.0 40.00 6.00 30.00 0.00 38.00 0
site6 40.25 0 10.50 0.0 5.75 6.25 7.25 3.25 8.75 1.25")
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.