Доступ к конкретным экземплярам в списке в столбце данных, а также к длине списка счетчиков - R - PullRequest
0 голосов
/ 26 апреля 2018

У меня есть R-кадр данных, состоящий из столбцов.Один столбец содержит списки: т.е.

      Column
      1,2,4,7,9,0
      5,3,8,9,0
      3,4
      5.8,9,3.5
      6
      NA
      7,4,3

Я хотел бы создать столбец, который рассчитывает, длина этих списков:

Column            Count
1,2,4,7,9,0       6
5,3,8,9,0         5
3,4               2
5.8,9,3.5        3
6                1
NA               NA
7,4,3            3

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

Ответы [ 3 ]

0 голосов
/ 26 апреля 2018

Вот несколько более быстрый способ достижения того же результата:

df$Count <- nchar(gsub('[^,]', '', df$Column)) + 1

Этот метод работает путем подсчета количества запятых и добавления 1.

0 голосов
/ 26 апреля 2018

count.fields служит для этой цели для текстового файла и может быть принудительно настроен для работы со столбцом:

df$Count <- count.fields(textConnection(df$Column), sep=",")
df$Count[is.na(df$Column)] <- NA

df
#       Column Count
#1 1,2,4,7,9,0     6
#2   5,3,8,9,0     5
#3         3,4     2
#4   5.8,9,3.5     3
#5           6     1
#6        <NA>    NA
#7       7,4,3     3

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

df$Column <- strsplit(df$Column, ",")
lengths(df$Column)
#[1] 6 5 2 3 1 1 3
sapply(df$Column, `[`, 1)
#[1] "1"   "5"   "3"   "5.8" "6"   NA    "7"  

stack(setNames(df$Column, seq_along(df$Column)))
#   values ind
#1       1   1
#2       2   1
#3       4   1
#4       7   1
#5       9   1
#6       0   1
#7       5   2
#8       3   2
#9       8   2
# etc
0 голосов
/ 26 апреля 2018

Одним из решений является использование strsplit для разбиения элемента в символьном векторе и использование sapply для получения желаемого количества:

df$count <- sapply(strsplit(df$Column, ","),function(x){
  if(all(is.na(x))){
    NA
  } else {
    length(x)
  }
})
df
# Column          count
# 1 1,2,4,7,9,0     6
# 2   5,3,8,9,0     5
# 3         3,4     2
# 4   5.8,9,3.5     3
# 5           6     1
# 6        <NA>    NA
# 7       7,4,3     3

Если необходимо считать NA как 1тогда решение могло бы быть еще проще:

df$count <- sapply(strsplit(df$Column, ","),length)

Данные:

df <- read.table(text = "Column
'1,2,4,7,9,0'
'5,3,8,9,0'
'3,4'
'5.8,9,3.5'
'6'
NA
'7,4,3'",
header = TRUE, stringsAsFactors = FALSE)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...