【问题标题】:Syntax - R Data Frames语法 - R 数据帧
【发布时间】:2019-05-07 04:37:36
【问题描述】:

我有一个数据框 df。

30 列,约 150 万行。

我想通过将这些列中的每个数字除以该列的平均值来“标准化”第 13 到 30 列。我可以这样做:

df_norm[, 13] <- df[, 13] / Column_Means[1]
df_norm[, 14] <- df[, 14] / Column_Means[2]
df_norm[, 15] <- df[, 15] / Column_Means[3]
...etc...etc...etc..
df_norm[, 29] <- df[, 29] / Column_Means[17]
df_norm[, 30] <- df[, 30] / Column_Means[18]

它可以工作,但它很笨拙而且有点慢。我曾希望在一行中完成所有操作,可能是这样的:

df_norm[, 13:30] <- df[, 13:30] / Column_Means

df_norm[, 13:30] <- df[, 13:30] / Column_Means[1:18]

但这似乎不起作用 - 它总是除以 Column_Means[1] 而不是遍历所有 18 个值。

请有人告诉我是否有一行代码可以满足我的需要?如果可以的话,我喜欢写简洁的代码,但我对 R 的语法有点新手。

非常感谢...

【问题讨论】:

  • df_norm[,13:30]&lt;-lapply(df[,13:30],function(x) x/mean(x)).

标签: r dataframe syntax


【解决方案1】:

您可以使用applylapply 并在里面制作您的函数

apply(df[,13:30],2, function(x) x/mean(x))
lapply(df[,13:30], function(x) x/mean(x))

就像@Roland 所说,最好使用lapply 循环遍历data.frame 列。

【讨论】:

  • 你不应该使用apply。使用 lapply 循环遍历 data.frame 列。
【解决方案2】:

这是一个使用 R 中可用的数据帧 mtcars 的示例。让我们将其加载到一个新的数据帧中,以便我们稍后对其进行修改:

df_cars <- mtcars

现在,假设您要“规范化”前两列:

df_cars[ , c(1:2)] <- df_cars[ , c(1:2)]/colMeans(df_cars)[c(1:2)]

希望对你有帮助!

【讨论】:

  • 谢谢。是的,更紧凑一点!
猜你喜欢
  • 1970-01-01
  • 2019-11-05
  • 2017-06-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-07-14
  • 1970-01-01
相关资源
最近更新 更多