如何使用 apply 函数在数据框中添加和重命名行
How to add and rename a row in a dataframe using the apply function
我是 R 编程的新手,从我之前创建的数据框中,我必须添加一个包含所有列的平均值的行,该行必须被称为 'Average'。应该注意的是,最后一列包含 NA 值。
到目前为止,我已经成功地为每一列和最后一列创建了新行,省略了 NA 值。我需要的是命名该行并将其放入 'Average',默认情况下它显示为 51,我不知道如何更改它,我已经阅读了函数 row.names () 等,但是我什么都出不来。
有人可以帮帮我吗?我将不胜感激
我把数据框留在这里 (state.df):
state.df = as.data.frame(state.x77)
这是我所做的:
apply = apply(state.df, MARGIN = 2, mean, na.rm = TRUE)
rbind(state.df,apply)
我也试过这个和其他一些东西,但它对我不起作用。
rbind(state.df,apply, rownames(state.df, prefix = 'Average'))
综上所述,通过apply我已经有了我基本想要的东西,我只是想把我做rbind时出现的名字51改成'Average'
rbind
仅为类似矩阵的参数从参数名称构造行名称。 apply
和 colMeans
return 都是 非 矩阵的向量。您可以使用 t
将此向量强制转换为矩阵,以便实际使用参数名称(在本例中为 Average
)。
dd <- data.frame(x = rnorm(10L), y = c(NA, rnorm(9L)))
rbind(dd, Average = t(colMeans(dd, na.rm = TRUE)))
# x y
# 1 0.4070128 NA
# 2 1.2352564 0.5730119
# 3 -0.5842432 -0.2096068
# 4 0.1695935 -1.0667109
# 5 -0.7393369 -1.5895364
# 6 -0.7394052 -1.0886582
# 7 0.9922455 -0.2560118
# 8 -3.0080877 -2.1085712
# 9 -0.3629210 -1.9192967
# 10 -0.5564323 -0.5459473
# Average -0.3186318 -0.9123697
rbind(dd, Average = colMeans(dd, na.rm = TRUE))
# x y
# 1 0.4070128 NA
# 2 1.2352564 0.5730119
# 3 -0.5842432 -0.2096068
# 4 0.1695935 -1.0667109
# 5 -0.7393369 -1.5895364
# 6 -0.7394052 -1.0886582
# 7 0.9922455 -0.2560118
# 8 -3.0080877 -2.1085712
# 9 -0.3629210 -1.9192967
# 10 -0.5564323 -0.5459473
# 11 -0.3186318 -0.9123697
当然,正如评论中指出的那样,您始终可以在事后使用 row.names<-
修改行名称。
您可以将 colMeans(dd, na.rm = TRUE)
替换为 apply(dd, 2L, mean, na.rm = TRUE)
并获得相同的结果,但 colMeans
更快。对于均值以外的操作,您可能需要 apply
.
我是 R 编程的新手,从我之前创建的数据框中,我必须添加一个包含所有列的平均值的行,该行必须被称为 'Average'。应该注意的是,最后一列包含 NA 值。
到目前为止,我已经成功地为每一列和最后一列创建了新行,省略了 NA 值。我需要的是命名该行并将其放入 'Average',默认情况下它显示为 51,我不知道如何更改它,我已经阅读了函数 row.names () 等,但是我什么都出不来。
有人可以帮帮我吗?我将不胜感激
我把数据框留在这里 (state.df):
state.df = as.data.frame(state.x77)
这是我所做的:
apply = apply(state.df, MARGIN = 2, mean, na.rm = TRUE)
rbind(state.df,apply)
我也试过这个和其他一些东西,但它对我不起作用。
rbind(state.df,apply, rownames(state.df, prefix = 'Average'))
综上所述,通过apply我已经有了我基本想要的东西,我只是想把我做rbind时出现的名字51改成'Average'
rbind
仅为类似矩阵的参数从参数名称构造行名称。 apply
和 colMeans
return 都是 非 矩阵的向量。您可以使用 t
将此向量强制转换为矩阵,以便实际使用参数名称(在本例中为 Average
)。
dd <- data.frame(x = rnorm(10L), y = c(NA, rnorm(9L)))
rbind(dd, Average = t(colMeans(dd, na.rm = TRUE)))
# x y
# 1 0.4070128 NA
# 2 1.2352564 0.5730119
# 3 -0.5842432 -0.2096068
# 4 0.1695935 -1.0667109
# 5 -0.7393369 -1.5895364
# 6 -0.7394052 -1.0886582
# 7 0.9922455 -0.2560118
# 8 -3.0080877 -2.1085712
# 9 -0.3629210 -1.9192967
# 10 -0.5564323 -0.5459473
# Average -0.3186318 -0.9123697
rbind(dd, Average = colMeans(dd, na.rm = TRUE))
# x y
# 1 0.4070128 NA
# 2 1.2352564 0.5730119
# 3 -0.5842432 -0.2096068
# 4 0.1695935 -1.0667109
# 5 -0.7393369 -1.5895364
# 6 -0.7394052 -1.0886582
# 7 0.9922455 -0.2560118
# 8 -3.0080877 -2.1085712
# 9 -0.3629210 -1.9192967
# 10 -0.5564323 -0.5459473
# 11 -0.3186318 -0.9123697
当然,正如评论中指出的那样,您始终可以在事后使用 row.names<-
修改行名称。
您可以将 colMeans(dd, na.rm = TRUE)
替换为 apply(dd, 2L, mean, na.rm = TRUE)
并获得相同的结果,但 colMeans
更快。对于均值以外的操作,您可能需要 apply
.