Использование sapply внутри lapply только для определенных переменных / вложенного цикла - PullRequest
0 голосов
/ 21 мая 2018

Я хотел бы ответить на мой вопрос в два этапа, чтобы лучше понять способ кодирования.

Часть 1:

Предположим, у меня естьсписок вроде этого:

x <- data.frame(replicate(5,sample(0:100,10,rep=TRUE)))

y <- data.frame(replicate(5,sample(0:100,10,rep=TRUE)))

z <- list(x, y)

Я хотел бы получить диапазон чисел каждого столбца каждого списка.Я не совсем понял, как я могу объединить lapply с sapply, чтобы получить результаты для каждого столбца данных в моем списке.Любые идеи о том, как я мог бы сделать это?

Все, что я мог бы сделать для правильной работы, - это если бы я хотел получить диапазон, скажем, третьего столбца первого элемента списка:

range(z[[1]][[2]])

Часть 2:

Вторая часть моего вопроса идет немного дальше.На этот раз я добавлю столбец с символами к моим фреймам данных.

a <- data.frame(replicate(5,sample(0:100,10,rep=TRUE)))
a$x6 <- letters[1:10]

b <- data.frame(replicate(5,sample(0:100,10,rep=TRUE)))
b$x6 <- letters[1:10] 

c <- list(x, y)

Я хотел бы получить диапазон чисел каждого столбца каждого списка за исключением столбца 6, который не является числовым.Я не хочу удалять этот столбец, а скорее запросить только числовые столбцы.

Есть идеи, как мне это сделать эффективно?Я полагаю, что комбинация lapply и sapply была бы лучшей.

Если у вас есть идея, как сделать это с помощью вложенного цикла, это также было бы интересно узнать.Может быть, вторая часть также работает только с вложенным циклом ...

Ответы [ 2 ]

0 голосов
/ 21 мая 2018

Первое можно сделать с помощью

lapply(z, function(a) sapply(a,range))

[[1]]
     X1 X2 X3 X4 X5
[1,]  2 13 28  2  3
[2,] 95 97 98 99 85

[[2]]
     X1 X2 X3 X4  X5
[1,]  7  4 16  5  19
[2,] 90 90 82 84 100

Второе можно сделать с помощью

lapply(c, function(a) sapply(a[sapply(a,is.numeric)],range))

[[1]]
     X1 X2 X3 X4 X5
[1,]  7  5  0  3  8
[2,] 97 81 96 93 94

[[2]]
     X1 X2  X3 X4 X5
[1,]  8  4   0  9  7
[2,] 72 90 100 99 94

Внутренний sapply в этом создает логический вектор индексов столбцовкаждый элемент c является числовым, поэтому он не будет содержать символьный столбец в цикле.

Кстати, использование c в качестве имени переменной в R - плохая идея, так какэто также общая функция!

0 голосов
/ 21 мая 2018

Первая из них проста с использованием вложенных функций.

lapply(z, function(d) { sapply(d, range) })
[[1]]
     X1 X2 X3 X4  X5
[1,]  7  0  1  0   1
[2,] 86 82 96 91 100

[[2]]
     X1 X2 X3 X4 X5
[1,]  6  0  3 14  1
[2,] 98 84 99 89 73

Во-вторых, вложенные функции начинают становиться немного уродливыми:

> lapply(z, function(d) {
   sapply(d, function(col) {
    if (is.numeric(col)) { range(col) } else { c(NA, NA) }
   })
  })
[[1]]
     X1 X2 X3 X4 X5 x6
[1,]  8  0  3 12  0 NA
[2,] 93 97 92 97 97 NA

[[2]]
     X1  X2 X3 X4 X5 x6
[1,] 20  31 10  5 17 NA
[2,] 84 100 88 94 99 NA
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...