将功能突变为除少数单元格外的列

时间:2019-10-27 12:54:28

标签: r

我有一个数据集,我需要一次为几列取值。我已经应用了mutate函数来做到这一点。但是在各列中也需要排除一些文本,例如,

df 
ColA   ColB      ColC
A     56.568     45.590
B     60.596      B
C     A          78.456

df1 <- df %>% mutate_at(vars(ColB, ColC),funs(round(.,1)))

但是由于列中包含字符,所以我无法执行它。预期输出为

df1
ColA   ColB    ColC
A     56.5     45.5
B     60.5      B
C     A        78.4

1 个答案:

答案 0 :(得分:0)

如果同一列中有字符和数字,则默认为字符,并且不能四舍五入。

您必须使用自定义功能:

library(purrr)
library(dplyr)

df = data.frame(
   ColA=c("A","B","C"),
   ColB=c(56.568,60.596,"A"),
   ColC=c(45.590,"B",78.456)
            )
# you can see they are converted to factor
str(df)
###function to round numbers and convert them back to characters
convertCol = function(x){
y = round(suppressWarnings(as.numeric(as.character(x))),1)
y = as.character(y)
y[is.na(y)] = as.character(x[is.na(y)])
y
}
df %>% map_df(convertCol)

仍然,不可能在同一列中同时包含字符和数字。而且在一个和另一个之间切换可能非常疯狂