R 将除两列以外的所有列从字符强制转换为数字

R 将除两列以外的所有列从字符强制转换为数字,r,R,我有一个数据框,有51个观察值和43个变量,所有这些都是字符。我想强制3:43列为数字。如何在不接触前两列的情况下将其强制转换为数值 我附上了一个类似于我的示例数据框,但它不是我真正的数据框我不是数据的唯一所有者,所以我不能合法地共享它。假设前两列实际上是字符,而不是双字符,这将为您提供一个良好的图片。给您带来的不便,我深表歉意 df <- structure(list(`Analyte Sample` = c(1, 2, 3, 4, 5, 6), A = c("4190&qu

我有一个数据框,有51个观察值和43个变量,所有这些都是字符。我想强制3:43列为数字。如何在不接触前两列的情况下将其强制转换为数值

我附上了一个类似于我的示例数据框,但它不是我真正的数据框我不是数据的唯一所有者,所以我不能合法地共享它。假设前两列实际上是字符,而不是双字符,这将为您提供一个良好的图片。给您带来的不便,我深表歉意

df <- structure(list(`Analyte  Sample` = c(1, 2, 3, 4, 5, 6), A = c("4190", "6665", "7435", "2052", "783", "322"), B = c("11569", "6677", 
"3852", "983.88", "589", "359"), C = c("20453", "7699", "2499", "707.98", "412", "328"), D = c("7893", NA, "1623", "685.64", 
"321", "644"), E = c("320", "15444", "2049", "1065", "389", "365"), F = c("7438", NA, "3472", "1057", "563", "401"), G = c(7345, 
9001, 2473, 1138, 516, 403), H = c("9004", "3998", "2299", "964.88", "499", "341"), I = c("8434", "8700", "2217", "1263", "567", "352"
), J = c("7734", "6733", "2092", "1115", "637", "332"), K = c(NA, NA, "2118", "862.13", "426", "355"), L = c(6345, 7688, 2311, 
1195, 647, 366), M = c("4222", NA, "1846", "814.61", "422", "314"), N = c("6773", "8934", "2381", "1221", "677", "356"), O = c(NA, 
NA, NA, "564.5", "226", "476")), row.names = c(NA, -6L), class = c("tbl_df", "tbl", "data.frame"))
尝试以下基本解决方案:

df[,3:43] <- apply(df[,3:43],2,as.numeric)
尝试以下基本解决方案:

df[,3:43] <- apply(df[,3:43],2,as.numeric)
使用

如果有字符,它们将转换为因子。如果要将它们作为字符进行维护,请使用

df <- type.convert(df, as.is = TRUE)
如果您只需要数据帧的一部分。即,如果您希望保留数字作为字符:

df[,my_columns]<- type.convert(df[, my_columns])
使用

如果有字符,它们将转换为因子。如果要将它们作为字符进行维护,请使用

df <- type.convert(df, as.is = TRUE)
如果您只需要数据帧的一部分。即,如果您希望保留数字作为字符:

df[,my_columns]<- type.convert(df[, my_columns])
使用lappy转换列类型很流行

df[3:43] <- lapply(df[3:43], as.numeric)
请注意,不要使用“应用”转换data.frame的列类型。apply首先将data.frame转换为矩阵,因此所有列都将强制转换为单个类型。例如:

df <- data.frame(x = as.character(1:3), y = c(T, T, F))
如果您想通过应用同时转换它们,它将崩溃并发出警告

df[] <- apply(df, 2, as.numeric)
df

#   x  y
# 1 1 NA
# 2 2 NA
# 3 3 NA
#
# Warning message:
# In apply(df, 2, as.numeric) : NAs introduced by coercion
在第二列上应用as.numeric将创建NA。在您的例子中,apply之所以有效,是因为所有列都可以转换为数字。但一般来说,这不是处理data.frame的标准方法。相比之下,lapply工作得很好

df[] <- lapply(df, as.numeric)
df

#   x y
# 1 1 1
# 2 2 1
# 3 3 0
使用lappy转换列类型很流行

df[3:43] <- lapply(df[3:43], as.numeric)
请注意,不要使用“应用”转换data.frame的列类型。apply首先将data.frame转换为矩阵,因此所有列都将强制转换为单个类型。例如:

df <- data.frame(x = as.character(1:3), y = c(T, T, F))
如果您想通过应用同时转换它们,它将崩溃并发出警告

df[] <- apply(df, 2, as.numeric)
df

#   x  y
# 1 1 NA
# 2 2 NA
# 3 3 NA
#
# Warning message:
# In apply(df, 2, as.numeric) : NAs introduced by coercion
在第二列上应用as.numeric将创建NA。在您的例子中,apply之所以有效,是因为所有列都可以转换为数字。但一般来说,这不是处理data.frame的标准方法。相比之下,lapply工作得很好

df[] <- lapply(df, as.numeric)
df

#   x y
# 1 1 1
# 2 2 1
# 3 3 0

您可以使用tidyverse尝试这种简单的方法


您可以使用tidyverse尝试这种简单的方法


请通过@Onyanbu的链接阅读了解有关applyAgree的信息!在这种情况下,apply可以工作,因为所有列都可以转换为数字。但一般来说,这不是处理data.frame的最佳方式。请核对我的答案。欢迎给我一些反馈。是的,我刚刚注意到使用这个命令将我的df变成了一个矩阵,我在R还是个新手,这完全违背了我以前工作的目的:不过,谢谢你的提示@ReeNadeau为了澄清,apply返回一个矩阵,但在将其分配回df后,结果应该是data.frame。我认为Duck的答案适用于您的案例,但这可能不是本期的标准方式。请阅读@Onyambu链接了解applyAgree!在这种情况下,apply可以工作,因为所有列都可以转换为数字。但一般来说,这不是处理data.frame的最佳方式。请核对我的答案。欢迎给我一些反馈。是的,我刚刚注意到使用这个命令将我的df变成了一个矩阵,我在R还是个新手,这完全违背了我以前工作的目的:不过,谢谢你的提示@ReeNadeau为了澄清,apply返回一个矩阵,但在将其分配回df后,结果应该是data.frame。我认为Duck的答案适合你的情况,但这可能不是这个问题的标准方法。好主意!但是,在dplyr 1.0.0之后,mutate_at已经被cross的使用所取代。你可以检查我的答案,看是否使用了cross。顺便说一下,您只在dplyr中使用mutate_at,所以不需要加载整个tidyverse包。使用librarydplyr就足够了,而且更友好。好主意!但是,在dplyr 1.0.0之后,mutate_at已经被cross的使用所取代。你可以检查我的答案,看是否使用了cross。顺便说一下,您只在dplyr中使用mutate_at,所以不需要加载整个tidyverse包。使用librarydplyr就足够了,而且更友好。