我的数据如下所示:
A 栏 | B 栏 | C 栏 |
---|---|---|
1 | 2 3 | 不适用 |
4 | 5 | 6 |
7 | 8 | 9 |
10 | 11 12 |
我正在尝试在 R 中清理它。每一列必须包含一个数字。在第 1 行的情况下,数字 3 属于 C 列,但存储在 B 列中。同样,我有 B 列,即最后一行,其中 12 属于 C 列,但存储在 B 中。
我该如何在 R 中清理这个?
我是 R 新手,以前没有遇到过这样的问题。
它看起来导入不正确,但如果您没有能力修复它那里(首选),这里有一个修复该框架的技巧:
quux[] <- t(apply(quux, 1, \(z) setdiff(strsplit(paste(setdiff(z, c(NA, "")), collapse = " "), " ")[[1]], ""))) |>
as.data.frame() |>
lapply(type.convert, as.is = TRUE)
quux
# Column A Column B Column C
# 1 1 2 3
# 2 4 5 6
# 3 7 8 9
# 4 10 11 12
str(quux)
# 'data.frame': 4 obs. of 3 variables:
# $ Column A: int 1 4 7 10
# $ Column B: int 2 5 8 11
# $ Column C: int 3 6 9 12
数据
quux <- structure(list("Column A" = c(1L, 4L, 7L, 10L), "Column B" = c("2 3", "5", "8", "11 12"), "Column C" = c(NA, 6L, 9L, NA)), class = "data.frame", row.names = c(NA, -4L))
这是一个 tidyverse 解决方案:
library(tidyverse)
mydf %>%
unite(col, everything(), sep = " ") %>%
separate(col, into = paste0("Column", LETTERS[1:length(mydf)]), sep = " ")
结果:
ColumnA ColumnB ColumnC
1 1 2 3
2 4 5 6
3 7 8 9
4 10 11 12
为了避免警告,您可以通过以下方式增强脚本:
mydf[mydf == ""] <- NA
mydf %>%
unite(col, everything(), sep = " ", na.rm = T) %>%
separate(col, into = paste0("Column", LETTERS[1:length(mydf)]), sep = " ")
如果您希望转换类型(并确保框架中没有除整数之外的数据),您可以添加以下行:
... %>%
mutate(across(everything(), as.integer))
使用数据:
mydf <-
data.frame(ColumnA = c("1", "4", "7", "10"),
ColumnB = c("2 3", "5", "8", "11 12"),
ColumnC = c(NA, "6", "9", "")
)