我有一个非常大的数据框,结构如下:
User A B C D
1 1,0 0,0 0,2 1,1
2 1,1,1 0,0,1 0,0,0 2,2,1
3 1 0 0 1
4 2,1,2 1,1,1 3,2,1 1,1,1
我需要从每个向量/单元格中取出最高值,并用最高值替换相应的单元格。换句话说,数据框应如下所示:
User A B C D
1 1 0 2 1
2 1 1 0 2
3 1 0 0 1
4 2 1 3 1
要创建第一个数据框,我使用了基于用户编号的聚合。我想过尝试使用gsub,但这需要我先验地确定特定的组合,并且考虑到这个数据集的大小,这可能会导致太多的错误。
非常感谢任何帮助!
答案 0 :(得分:3)
只需拆分每个条目并取最大值
## create data
df = read.table(text="User A B C D
1 '1,0' '0,0' '0,2' '1,1'
2 '1,1,1' '0,0,1' '0,0,0' '2,2,1'
3 '1' '0' '0' '1'
4 '2,1,2' '1,1,1' '3,2,1' '1,1,1'",
header=TRUE, stringsAsFactors=FALSE)
for(i in 2:5) {
df[,i] = sapply(strsplit(df[,i], ","), function(x) max(as.numeric(x))) }
df
User A B C D
1 1 1 0 2 1
2 2 1 1 0 2
3 3 1 0 0 1
4 4 2 1 3 1
答案 1 :(得分:0)
以下是tidyverse
library(tidyverse)
f1 <- function(dot) {
str_extract_all(dot, '[0-9]+') %>%
map(as.numeric) %>%
map_dbl(max)
df %>%
mutate_at(vars(-User), funs(f1))
# User A B C D
#1 1 1 0 2 1
#2 2 1 1 0 2
#3 3 1 0 0 1
#4 4 2 1 3 1
如果我们使用cSplit
中的splitstackshape
,则可以使其更紧凑
library(splitstackshape)
cSplit(df, names(df)[-1], ",", "long")[, lapply(.SD, max, na.rm = TRUE), User]
# User A B C D
#1: 1 1 0 2 1
#2: 2 1 1 0 2
#3: 3 1 0 0 1
#4: 4 2 1 3 1
df <- structure(list(User = 1:4, A = c("1,0", "1,1,1", "1", "2,1,2"
), B = c("0,0", "0,0,1", "0", "1,1,1"), C = c("0,2", "0,0,0",
"0", "3,2,1"), D = c("1,1", "2,2,1", "1", "1,1,1")), .Names = c("User",
"A", "B", "C", "D"), class = "data.frame", row.names = c(NA,
-4L))