В JDK1.8 вы можете использовать агрегированные операции и выражение лямбда:
String[] strArray = new String[] {"John", "Mary", "Bob"};
// #1
Arrays.asList(strArray).stream().forEach(s -> System.out.println(s));
// #2
Stream.of(strArray).forEach(System.out::println);
// #3
Arrays.stream(strArray).forEach(System.out::println);
/* output:
John
Mary
Bob
*/
Некоторые данные:
insurance <- data.frame(
int = 1:5,
fact1 = letters[1:5],
fact2 = factor(1:5),
fact3 = LETTERS[3:7]
)
Я бы использовал sapply
, как вы, но в сочетании с is.factor
, чтобы вернуть логический вектор:
is.fact <- sapply(insurance, is.factor)
# int fact1 fact2 fact3
# FALSE TRUE TRUE TRUE
Затем используйте [
, чтобы извлечь эти столбцы:
factors.df <- insurance[, is.fact]
# fact1 fact2 fact3
# 1 a 1 C
# 2 b 2 D
# 3 c 3 E
# 4 d 4 F
# 5 e 5 G
Наконец, чтобы получить уровни, используйте lapply
:
lapply(factors.df, levels)
# $fact1
# [1] "a" "b" "c" "d" "e"
#
# $fact2
# [1] "1" "2" "3" "4" "5"
#
# $fact3
# [1] "C" "D" "E" "F" "G"
Вы также можете найти str(insurance)
интересным как краткое описание.
используя фрейм данных «страхование» от flodel, чтобы получить все факторы за один раз, вы можете использовать apply
, например:
apply(insurance,2,factor)
int fact1 fact2 fact3
[1,] "1" "a" "1" "C"
[2,] "2" "b" "2" "D"
[3,] "3" "c" "3" "E"
[4,] "4" "d" "4" "F"
[5,] "5" "e" "5" "G"
, если вы заинтересованы только в уровнях одним из факторов вы можете сделать следующее:
factor(insurance$fact1)
[1] a b c d e
Levels: a b c d e
Это (почти) кажется идеальным временем для использования редко используемой функции rapply
rapply(insurance, class = "factor", f = levels, how = "list")
Или
Filter(Negate(is.null),rapply(insurance, class = "factor", f = levels, how = "list"))
Чтобы удалить элементы NULL
(которые t факторов)
Или просто
lapply(Filter(is.factor,insurance), levels))