Получение последнего символа / номера столбца фрейма данных - PullRequest
1 голос
/ 27 марта 2020

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

names = as.character(c("ABC Co","DEF Co","XYZ Co")) 
code = as.character(c("ABCN1","DEFMO2","XYZIOIP4")) #variable length
my_df = as.data.frame(cbind(names,code))

Первый подход:

my_df[,3] = substr(my_df[,2],length(my_df[,2]),length(my_df[,2]))

То, что я ожидал получить, было: c("1","2","4")

Чем я являюсь на самом деле получается: c("C","F","Z")

Затем я понял, что length(my_df[,2]) - это количество строк моего фрейма данных, а не длина каждой ячейки. Итак, я решил создать это l oop:

for (i in length(nrow(my_df))){
  my_df[i,3] = substr(my_df[i,2],length(my_df[i,2]),length(my_df[i,2]))
}

То, что я ожидал получить, было: c("1","2","4")

Что я действительно получаю, это: c("A","F","Z")

Итак, я попытался:

for (i in length(nrow(my_df))){
  my_df[i,3] = substr(my_df[i,2],-1,-1)
}

То, что я ожидал получить, было: c("1","2","4")

Что я действительно получаю, это: c("","F","Z")

Не мне повезло, есть мысли о том, что мне не хватает? Большое спасибо!

Ответы [ 4 ]

1 голос
/ 27 марта 2020

length - это свойство vector (или list ), тогда как в substr вам, вероятно, понадобится свойство string . nchar базовых R работает.

my_df = as.data.frame(cbind(names, code), stringsAsFactors = FALSE)
substr(my_df[,2], nchar(my_df[,2]), nchar(my_df[,2]))
# [1] "1" "2" "4"

(я добавил stringsAsFactors = FALSE, в противном случае вам нужно будет добавить as.character.)

1 голос
/ 27 марта 2020

Если последний символ всегда является числом, которое вы можете сделать:

library(stringr)
str_extract(my_df$code, "\\d$")
[1] "1" "2" "4"

Если последний символ может быть чем угодно, вы можете сделать это:

str_extract(my_df$code, ".$")
0 голосов
/ 27 марта 2020

Мы можем использовать sub

 sub(".*(\\d+$)", "\\1", my_df$code)
0 голосов
/ 27 марта 2020

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

my_df$last_char <- substr(code, nchar(code), nchar(code))
# or my_df$last_char <- substr(my_df$code, nchar(my_df$code), nchar(my_df$code))

Выход

my_df

#   names     code last_char
# 1 ABC Co    ABCN1         1
# 2 DEF Co   DEFMO2         2
# 3 XYZ Co XYZIOIP4         4
...