根据其他数据框更改数据帧类

发布于 2025-01-19 22:42:18 字数 180 浏览 0 评论 0原文

我有一个从 Excel 导入的 R 数据框和一个使用脚本创建的数据框。这些数据框包含相同的列,但由于其中一列是从 Excel 导入的,因此列的类与使用脚本创建的数据框的列不同。 数据帧包含 500 多列,因此单独完成会花费大量时间。有什么方法可以将 Excel 导入的数据框的所有列的类更改为脚本创建的数据框的列的类吗?

非常感谢!

I have a dataframe in R that I import from excel and a dataframe that I create with a script. These dataframes contain the same columns but since one is imported from excel, the class of the columns are not identical to the columns of the dataframe created with the script.
The dataframes contain 500+ columns so to do it individually would take a lot of time. Is there any way to change the class of all columns of the excel imported dataframe to the class of the columns from the script created dataframe?

Many thanks!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

浮光之海 2025-01-26 22:42:18
df1 <- data.frame(a=1,b="2")
df2 <- data.frame(a=1L,b=2,d=3)
nms <- intersect(names(df1), names(df2))
df2[nms] <- Map(function(ref, tgt) { class(tgt) <- class(ref); tgt; }, df1[nms], df2[nms])
str(df2)
# 'data.frame': 1 obs. of  3 variables:
#  $ a: int 1
#  $ b: chr "2"
#  $ d: num 3

当然,$a 仍然是整数,而不是转换为数字;如果这不是问题,那么这就足够了。如果不是,那么可能会首选这种更详细、更灵活的选项:

cls <- sapply(df1[nms], function(z) class(z)[1])
df2[nms] <- Map(function(tgt, cl) {
  if (cl == "numeric") {
    tgt <- as.numeric(tgt)
  } else if (cl == "integer") {
    tgt <- as.integer(tgt)
  } else if (cl == "character") {
    tgt <- as.character(tgt)
  }
  tgt
}, df2[nms], cls)
str(df2)
# 'data.frame': 1 obs. of  3 variables:
#  $ a: num 1
#  $ b: chr "2"
#  $ d: num 3

sapply(.., class(z)[1]) 背后的基本原理是某些类的长度大于 1 (例如,tbl_dfPOSIXct),这会破坏该过程。

df1 <- data.frame(a=1,b="2")
df2 <- data.frame(a=1L,b=2,d=3)
nms <- intersect(names(df1), names(df2))
df2[nms] <- Map(function(ref, tgt) { class(tgt) <- class(ref); tgt; }, df1[nms], df2[nms])
str(df2)
# 'data.frame': 1 obs. of  3 variables:
#  $ a: int 1
#  $ b: chr "2"
#  $ d: num 3

Granted, $a remains integer instead of being cast to numeric; if that's not a concern, then that may suffice. If not, then this more-verbose and more-flexible option might be preferred:

cls <- sapply(df1[nms], function(z) class(z)[1])
df2[nms] <- Map(function(tgt, cl) {
  if (cl == "numeric") {
    tgt <- as.numeric(tgt)
  } else if (cl == "integer") {
    tgt <- as.integer(tgt)
  } else if (cl == "character") {
    tgt <- as.character(tgt)
  }
  tgt
}, df2[nms], cls)
str(df2)
# 'data.frame': 1 obs. of  3 variables:
#  $ a: num 1
#  $ b: chr "2"
#  $ d: num 3

The rationale behind sapply(.., class(z)[1]) is that some classes have length greater than 1 (e.g., tbl_df, POSIXct), which will spoil that process.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文