R 仅当数据帧中的列有意义时才将其转换为数字

R 仅当数据帧中的列有意义时才将其转换为数字,r,dataframe,numeric,coercion,R,Dataframe,Numeric,Coercion,在数据框data0中,列b实际上是字符,而列c实际上是数字。 我想将字符列转换为数字列“仅当”它有意义时。 如果我运行上述代码,列c将转换为我想要的数值,但列b将转换为我不想要的NA。 如何将“实际数值”列转换为数值列,同时保持其他列不变?这里想到的是HMisc包中的all.is.numeric函数-与dplyr样式变异相结合: data0 = data.frame(a=c(1,2,3,4),b=c("a","b","c","d"),c=c("1","2","3","4")) data0[,2]

在数据框
data0
中,列
b
实际上是字符,而列
c
实际上是数字。 我想将字符列转换为数字列“仅当”它有意义时。 如果我运行上述代码,列
c
将转换为我想要的数值,但列
b
将转换为我不想要的
NA

如何将“实际数值”列转换为数值列,同时保持其他列不变?

这里想到的是
HMisc
包中的
all.is.numeric
函数-与
dplyr
样式变异相结合:

data0 = data.frame(a=c(1,2,3,4),b=c("a","b","c","d"),c=c("1","2","3","4"))
data0[,2] = as.character(data0[,2])
data0[,3] = as.character(data0[,3])

class(data0[,2])
class(data0[,3])
data0[,2] = as.numeric(data0[,2])
data0[,3] = as.numeric(data0[,3])

class(data0[,2])
class(data0[,3])
data0[,2]
data0[,3]

all.is.numeric
检查字符向量中的所有元素是否都是数字,然后,
mutate\u if
位将所有符合此条件的列转换为数字。

这里想到的是
HMisc
包中的
all.is.numeric
函数-与
dplyr
样式的mutating结合使用:

data0 = data.frame(a=c(1,2,3,4),b=c("a","b","c","d"),c=c("1","2","3","4"))
data0[,2] = as.character(data0[,2])
data0[,3] = as.character(data0[,3])

class(data0[,2])
class(data0[,3])
data0[,2] = as.numeric(data0[,2])
data0[,3] = as.numeric(data0[,3])

class(data0[,2])
class(data0[,3])
data0[,2]
data0[,3]

all.is.numeric
检查字符向量中的所有元素是否都是数字,如果
位为true,则
会将所有列转换为数字。

尝试使用
type.convert
data0[]@akrun这是一个很好的解决方案。一个问题是“POSIXct”类型也被转换为字符,但我想保持原样。是的,为此您需要
inherits
@akrun我阅读了函数“inherit”的帮助文档,但不知道应该做什么。你能详细解释一下吗?试试
type.convert
ie.
data0[]@akrun这是一个很好的解决方案。一个问题是“POSIXct”类型也被转换为字符,但我想保持原样。是的,为此您需要
inherits
@akrun我阅读了函数“inherit”的帮助文档,但不知道应该做什么。你能详细解释一下吗?mutate_if(all.is.numeric(data0),as.numeric(data0))和你的命令有什么区别吗?我的代码使用管道操作符
%/%
来访问df,你的没有(在我的例子中抛出了一个错误)。如果(data0,all.is.numeric,as.numeric)
,没有管道的替代方案是
mutate\u if。另外,对于这两种选择,不要忘记将df保存在一个(新的或现有的)对象中,一个la
data1%mutate\u if(all.is.numeric,as.numeric)
mutate\u if(all.is.numeric(data0),as.numeric(data0))和您的命令之间的区别是什么?我的代码使用管道操作符
%/%
来访问df,您的代码没有(并在我的例子中抛出了一个bug)。没有PIPL的替代方法是
mutate\u if(data0,all.is.numeric,as.numeric)
。另外,对于这两种替代方法,不要忘记将df保存在(新的或现有的)对象中,即la
data1%mutate\u if(all.is.numeric,as.numeric)