如果我有一个如下的数据框,带有文本值和 NA 单元格的组合:
id | Col1 | Col2 | Col3 | Col4 | Col5 | 列... |
---|---|---|---|---|---|---|
id1 | 不适用 | 不适用 | 样品 | 不适用 | 重量 | 等 |
id2 | 不适用 | 尺寸 | 不适用 | 不适用 | 不适用 | 等 |
id3 | 音量 | 尺寸 | 样品 | 不适用 | 不适用 | 等 |
id4 | 不适用 | 不适用 | 不适用 | 数量 | 不适用 | 等 |
id5 | 不适用 | 不适用 | 样品 | 数量 | 重量 | 等 |
是否可以使用该列中最常用的值重命名标题,如下所示?
id | 音量 | 尺寸 | 样本 | 数量 | 重量 |
---|---|---|---|---|---|
id1 | 不适用 | 不适用 | 样品 | 不适用 | 重量 |
id2 | 不适用 | 尺寸 | 不适用 | 不适用 | 不适用 |
id3 | 音量 | 尺寸 | 样品 | 不适用 | 不适用 |
id4 | 不适用 | 不适用 | 不适用 | 数量 | 不适用 |
id5 | 不适用 | 不适用 | 样品 | 数量 | 重量 |
答案 0 :(得分:2)
试试下面的代码
> cbind(df[1], setNames(df[-1], sapply(df[-1], function(x) unique(na.omit(x)))))
id volume size sample qty weight
1 id1 <NA> <NA> sample <NA> weight
2 id2 <NA> size <NA> <NA> <NA>
3 id3 volume size sample <NA> <NA>
4 id4 <NA> <NA> <NA> qty <NA>
5 id5 <NA> <NA> sample qty weight
数据
> dput(df)
structure(list(id = c("id1", "id2", "id3", "id4", "id5"), Col1 = c(NA,
NA, "volume", NA, NA), Col2 = c(NA, "size", "size", NA, NA),
Col3 = c("sample", NA, "sample", NA, "sample"), Col4 = c(NA,
NA, NA, "qty", "qty"), Col5 = c("weight", NA, NA, NA, "weight"
)), class = "data.frame", row.names = c(NA, -5L))
答案 1 :(得分:1)
您可以使用 here 中的 Mode
函数获取每列中出现频率最高的值。
Mode <- function(x) {
ux <- unique(na.omit(x))
ux[which.max(tabulate(match(x, ux)))]
}
将其应用于每一列并更改列名称。
names(df)[-1] <- sapply(df[-1], Mode)
df
# id volume size sample qty weight
#1 id1 <NA> <NA> sample <NA> weight
#2 id2 <NA> size <NA> <NA> <NA>
#3 id3 volume size sample <NA> <NA>
#4 id4 <NA> <NA> <NA> qty <NA>
#5 id5 <NA> <NA> sample qty weight