Вставить список в виде столбца в Dataframe R

#r #list

#r #Список

Вопрос:

Я пытаюсь добавить столбец в конец моего фрейма данных. Предполагается, что столбец должен быть заполнен списком id . Однако, когда я пишу w <-cbind(w, id) , вместо этого он печатает все целиком id в каждую ячейку фрейма данных.

Текущий вывод:

     optOne%    optTwo%    Neither%    TotalCount    id
1   20         1          1           21            A1779TGH2ZMWJ2 A18ACKRAVMM8D8 A19JXVM2WO1CJ8 A1A7O3TW2O0TPM A1AKB300WFZPZ3
2   17         0          1           21            A1779TGH2ZMWJ2 A18ACKRAVMM8D8 A19JXVM2WO1CJ8 A1A7O3TW2O0TPM A1AKB300WFZPZ3
3   15         2          4           21            A1779TGH2ZMWJ2 A18ACKRAVMM8D8 A19JXVM2WO1CJ8 A1A7O3TW2O0TPM A1AKB300WFZPZ3
4   12         0          9           21            A1779TGH2ZMWJ2 A18ACKRAVMM8D8 A19JXVM2WO1CJ8 A1A7O3TW2O0TPM A1AKB300WFZPZ3
5   18         1          2           21            A1779TGH2ZMWJ2 A18ACKRAVMM8D8 A19JXVM2WO1CJ8 A1A7O3TW2O0TPM A1AKB300WFZPZ3
 

желаемый результат:

     optOne%    optTwo%    Neither%    TotalCount    id
1   20         1          1           21            A1779TGH2ZMWJ2 
2   17         0          1           21            A18ACKRAVMM8D8 
3   15         2          4           21            A19JXVM2WO1CJ8
4   12         0          9           21            A1A7O3TW2O0TPM
5   18         1          2           21            A1AKB300WFZPZ3
 

Комментарии:

1. Без воспроизводимого примера трудно догадаться, как id на самом деле выглядит.

2. print(id) ВОЗВРАТ: [1] "A1779TGH2ZMWJ2 A18ACKRAVMM8D8 A19JXVM2WO1CJ8 A1A7O3TW2O0TPM A1AKB300WFZPZ3"

3. Может показаться, что id это символьный вектор длиной 1, а не список или символьный вектор того же размера, что и ваш набор данных. Пожалуйста, предоставьте воспроизводимый пример. При этом вы можете найти свое решение!

4. Арррх. Читать ?cbind.data.frame . В нем не говорится, что списки являются допустимыми входными данными.

Ответ №1:

Похоже id , это одна строка, поэтому сначала вам понадобится strsplit ее (которая выводит список). затем просто добавьте новый столбец, используя $

 w$id <- unlist(strsplit(id,split=" "))
 

Комментарии:

1. Если guildenstem's данные выглядят как приведенные ниже, dat$id <- strsplit(dat$id, » «)[[1]]

Ответ №2:

Вы также могли бы сделать:

  dat <- read.table(text="optOne%,optTwo%,Neither%,TotalCount,id
 1,20,1,1,21,A1779TGH2ZMWJ2 A18ACKRAVMM8D8 A19JXVM2WO1CJ8 A1A7O3TW2O0TPM A1AKB300WFZPZ3
 2,17,0,1,21,A1779TGH2ZMWJ2 A18ACKRAVMM8D8 A19JXVM2WO1CJ8 A1A7O3TW2O0TPM A1AKB300WFZPZ3
 3,15,2,4,21,A1779TGH2ZMWJ2 A18ACKRAVMM8D8 A19JXVM2WO1CJ8 A1A7O3TW2O0TPM A1AKB300WFZPZ3
 4,12,0,9,21,A1779TGH2ZMWJ2 A18ACKRAVMM8D8 A19JXVM2WO1CJ8 A1A7O3TW2O0TPM A1AKB300WFZPZ3
 5,18,1,2,21,A1779TGH2ZMWJ2 A18ACKRAVMM8D8 A19JXVM2WO1CJ8 A1A7O3TW2O0TPM A1AKB300WFZPZ3",
 sep=",",header=TRUE,stringsAsFactors=F,check.names=F)

 transform(dat, id=unique(scan(text=id, what="character")))
 #Read 25 items
 #  optOne. optTwo. Neither. TotalCount             id
 #1      20       1        1         21 A1779TGH2ZMWJ2
 #2      17       0        1         21 A18ACKRAVMM8D8
 #3      15       2        4         21 A19JXVM2WO1CJ8
 # 4      12       0        9         21 A1A7O3TW2O0TPM
 #5      18       1        2         21 A1AKB300WFZPZ3