删除 R data.frame 中的重复字段
Delete repeated fields in an R data.frame
我是 R 的新手,我需要你的帮助来做一些直到现在我做不到的事情:
我有一个可以有随机数列的数据框,我需要在数据框的每一列中只保留唯一值,但这必须独立于其他列来完成:
例如,如果有以下数据框:
Column_A Column_B Column_C
A 1 A1
A 2 A2
B 1 A3
B 2 A4
C 3 A5
C 4 A6
此代码后的输出必须是:
Column_A Column_B Column_C
A 1 A1
B 2 A2
C 3 A3
4 A4
A5
A6
我试过 ds <- unique(ds)
但它只会在所有列之间留下唯一关系。
我真的很感激你能给我的任何帮助或指导。
提前致谢。
数据
`> str(df)
'data.frame': 6 obs. of 3 variables:
$ A: chr "A" "B" "C" "A" ...
$ B: num 1 2 1 2 3 4
$ C: chr "A1" "A2" "A3" "A4" ...`
循环
`i <- 1`
`while (i < ncol(df)){
+ df[i] <- lapply(df, function(x) {
+ x[duplicated(x)] <- ''
+ c(x[x!=''], x[x==''])})
+ i <- i+1
+}`
如果有 'factor' 列,最好将其转换为 character
或包括 ''
作为 factor
列的级别之一。在这里,我首先将 factor
列更改为 character
。
indx <- sapply(df1, is.factor)
df1[indx] <- lapply(df1[indx], as.character)
用 lapply
循环列,用 ''
替换 duplicated
元素,排列元素使空字符串在末尾 (c(x[x=''],x==''])
)
df1[] <- lapply(df1, function(x) {
x[duplicated(x)] <- ''
c(x[x!=''], x[x==''])})
df1
# Column_A Column_B Column_C
#1 A 1 A1
#2 B 2 A2
#3 C 3 A3
#4 4 A4
#5 A5
#6 A6
或者另一种选择是使用 match
df1[] <- lapply(df1, function(x) c(x[match(unique(x),x)],
rep('', length(x)-length(unique(x)))))
注意:使用 ''
会将数字列 classes 更改为 'character/factor' class。最好用 NA
替换,也可以使用自定义函数 is.na/na.omit/complete.cases
等轻松删除。
数据
df1 <- structure(list(Column_A = structure(c(1L, 1L, 2L, 2L, 3L, 3L),
.Label = c("A",
"B", "C"), class = "factor"), Column_B = c(1L, 2L, 1L, 2L, 3L,
4L), Column_C = structure(1:6, .Label = c("A1", "A2", "A3", "A4",
"A5", "A6"), class = "factor")), .Names = c("Column_A", "Column_B",
"Column_C"), row.names = c(NA, -6L), class = "data.frame")
我是 R 的新手,我需要你的帮助来做一些直到现在我做不到的事情:
我有一个可以有随机数列的数据框,我需要在数据框的每一列中只保留唯一值,但这必须独立于其他列来完成:
例如,如果有以下数据框:
Column_A Column_B Column_C
A 1 A1
A 2 A2
B 1 A3
B 2 A4
C 3 A5
C 4 A6
此代码后的输出必须是:
Column_A Column_B Column_C
A 1 A1
B 2 A2
C 3 A3
4 A4
A5
A6
我试过 ds <- unique(ds)
但它只会在所有列之间留下唯一关系。
我真的很感激你能给我的任何帮助或指导。
提前致谢。
数据
`> str(df)
'data.frame': 6 obs. of 3 variables:
$ A: chr "A" "B" "C" "A" ...
$ B: num 1 2 1 2 3 4
$ C: chr "A1" "A2" "A3" "A4" ...`
循环
`i <- 1`
`while (i < ncol(df)){
+ df[i] <- lapply(df, function(x) {
+ x[duplicated(x)] <- ''
+ c(x[x!=''], x[x==''])})
+ i <- i+1
+}`
如果有 'factor' 列,最好将其转换为 character
或包括 ''
作为 factor
列的级别之一。在这里,我首先将 factor
列更改为 character
。
indx <- sapply(df1, is.factor)
df1[indx] <- lapply(df1[indx], as.character)
用 lapply
循环列,用 ''
替换 duplicated
元素,排列元素使空字符串在末尾 (c(x[x=''],x==''])
)
df1[] <- lapply(df1, function(x) {
x[duplicated(x)] <- ''
c(x[x!=''], x[x==''])})
df1
# Column_A Column_B Column_C
#1 A 1 A1
#2 B 2 A2
#3 C 3 A3
#4 4 A4
#5 A5
#6 A6
或者另一种选择是使用 match
df1[] <- lapply(df1, function(x) c(x[match(unique(x),x)],
rep('', length(x)-length(unique(x)))))
注意:使用 ''
会将数字列 classes 更改为 'character/factor' class。最好用 NA
替换,也可以使用自定义函数 is.na/na.omit/complete.cases
等轻松删除。
数据
df1 <- structure(list(Column_A = structure(c(1L, 1L, 2L, 2L, 3L, 3L),
.Label = c("A",
"B", "C"), class = "factor"), Column_B = c(1L, 2L, 1L, 2L, 3L,
4L), Column_C = structure(1:6, .Label = c("A1", "A2", "A3", "A4",
"A5", "A6"), class = "factor")), .Names = c("Column_A", "Column_B",
"Column_C"), row.names = c(NA, -6L), class = "data.frame")