Как избежать цикла в R: выбор объектов из списка

Кроме того, не используйте "определение", если Вы действительно, действительно не хотите определить глобальную переменную. Используйте "позволяют" вместо этого:

(defn goo []
  (print "echo> ")
  (flush)
  (let [resp (read-line)]
    (print resp)
    (flush)))

или, короче

(defn goo []
  (print "echo> ")
  (flush)
  (print (read-line))
  (flush))
31
задан JD Long 31 August 2009 в 00:48
поделиться

8 ответов

Вы можете использовать apply (или sapply )

t <- c("bob_smith","mary_jane","jose_chung","michael_marx","charlie_ivan")
f <- function(s) strsplit(s, "_")[[1]][1]
sapply(t, f)

bob_smith    mary_jane   jose_chung michael_marx charlie_ivan 

       "bob"       "mary"       "jose"    "michael"    "charlie" 

См .: Краткое введение в «применить» в R

26
ответ дан 27 November 2019 в 21:28
поделиться

И еще один подход:

t <- c("bob_smith","mary_jane","jose_chung","michael_marx","charlie_ivan")
pieces <- strsplit(t,"_")
sapply(pieces, "[", 1)

На словах последняя строка извлекает первый элемент каждого компонента списка и затем упрощает его до вектора.

Как это работает? Что ж, вам нужно реализовать альтернативный способ записи x [1] : "[" (x, 1) , то есть есть функция с именем [ что делает подмножество. Вызов sapply применяет вызовы этой функции один раз для каждого элемента исходного списка, передавая два аргумента, элемент списка и 1.

Преимущество этого подхода перед другими заключается в том, что вы можете извлечь несколько элементы из списка без повторного вычисления разбиений. Например, фамилия будет sapply (шт., "[", 2) . Когда вы привыкнете к этой идиоме, ее будет довольно легко читать.

43
ответ дан 27 November 2019 в 21:28
поделиться

How about:

tlist <- c("bob_smith","mary_jane","jose_chung","michael_marx","charlie_ivan")
fnames <- gsub("(_.*)$", "", tlist)
# _.* matches the underscore followed by a string of characters
# the $ anchors the search at the end of the input string
# so, underscore followed by a string of characters followed by the end of the input string

for the RegEx approach?

10
ответ дан 27 November 2019 в 21:28
поделиться

Я сомневаюсь, что это самое элегантное решение, но оно превосходит цикл:

t.df <- data.frame(tsplit)
t.df[1, ]

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

7
ответ дан 27 November 2019 в 21:28
поделиться

Вы почти получили это. Это на самом деле просто вопрос

  1. использования одной из функций * apply для перебора существующего списка, я часто начинаю с lapply и иногда переключаю в sapply
  2. добавьте анонимную функцию, которая работает с одним из элементов списка за раз
  3. , вы уже знали, что это strsplit (string, splitterm) и вам нужен odd [[1]] [1] , чтобы выбрать первый член ответа
  4. , просто сложите все вместе, начиная с предпочтительной переменной namne (так как мы избегаем t или c и друзья)

, что дает

> tlist <- c("bob_smith","mary_jane","jose_chung","michael_marx","charlie_ivan") 
> fnames <- sapply(tlist, function(x) strsplit(x, "_")[[1]][1]) 
> fnames 
  bob_smith    mary_jane   jose_chung michael_marx charlie_ivan   
      "bob"       "mary"       "jose"    "michael"    "charlie" 
>
4
ответ дан 27 November 2019 в 21:28
поделиться

Вы можете использовать unlist () :

> tsplit <- unlist(strsplit(t,"_"))
> tsplit
 [1] "bob"     "smith"   "mary"    "jane"    "jose"    "chung"   "michael"
 [8] "marx"    "charlie" "ivan"   
> t_out <- tsplit[seq(1, length(tsplit), by = 2)]
> t_out
[1] "bob"     "mary"    "jose"    "michael" "charlie"

Может быть, лучше способ вытащить только нечетно проиндексированные записи, но в любом случае вы выиграли '

3
ответ дан 27 November 2019 в 21:28
поделиться

И еще один подход, основанный на в примере unlist brentonk ...

tlist <- c ("bob_smith", "mary_jane", "jose_chung", "michael_marx", "charlie_ivan")
tsplit <- unlist (strsplit (tlist, "_" ))
fnames <- tsplit [seq (1: length (tsplit)) %% 2 == 1]

2
ответ дан 27 November 2019 в 21:28
поделиться

Как насчет:

t <- c("bob_smith","mary_jane","jose_chung","michael_marx","charlie_ivan")

sub("_.*", "", t)
9
ответ дан 27 November 2019 в 21:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: