R - 在向量中提取最高值并使用该值替换

时间:2017-05-24 20:28:10

标签: r vector

我有一个非常大的数据框,结构如下:

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,但这需要我先验地确定特定的组合,并且考虑到这个数据集的大小,这可能会导致太多的错误。

非常感谢任何帮助!

2 个答案:

答案 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))