Как сохранить печатный вывод функции в виде вектора в R? - PullRequest
1 голос
/ 11 января 2020

У меня есть следующий столбец из dataframe

df <- data.frame(
 crime = as.character(c(115400, 171200, 91124, 263899, 67601, 51322)),
 stringsAsFactors=FALSE
)

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

for (i in df$crime){
  if (nchar(i)==6){
    print(substring(i,1,2))}
  else {print(substring(i,1,1))
  }
}

когда я запускаю эту функцию, я получаю следующий вывод, который мне нужен

[1] "11"
[1] "17"
[1] "9"
[1] "26"
[1] "6"
[1] "5"

Однако, я хочу, чтобы это было сохранено как стоящий вектор. как мне это сделать?

Ответы [ 4 ]

3 голосов
/ 11 января 2020

Вот базовое решение R с ifelse + substring

res <- with(df, substring(crime,1,ifelse(nchar(crime) == 6, 2, 1)))

таким, что

> res
[1] "11" "17" "9"  "26" "6"  "5" 
2 голосов
/ 11 января 2020

substr/substring векторизованы, поэтому мы можем использовать ifelse

v1 <- with(df1, ifelse(nchar(crime) == 6, substr(crime, 1, 2), substr(crime, 1, 1)))
v1
#[1] "11" "17" "9"  "26" "6"  "5" 

В операциях OP для l oop, vector можно инициализировать для сохранения выходных данных в каждом итераций

v1 <- character(nrow(df1))
for (i in seq_along(df1$crime)){
 if (nchar(df1$crime[i])==6){
      v1[i] <- substring(df1$crime[i],1,2)
   }  else {
      v1[i] <- substring(df1$crime[i],1,1)
    }
   }
0 голосов
/ 11 января 2020

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

Я буду использовать пакет data.table, поскольку он быстрый, что может быть удобно если ваши данные большие.

library(data.table)

# convert your data.frame to data.table
setDT(df)

# filter the rows where crime length is 6,
# and assign the first two characters of
# it into a new variable "extracted".
# some rows now have NAs in the new
# field. The last [] prints it to screen.
df[nchar(crime) == 6, extracted := substring(crime, 1, 2)][]
0 голосов
/ 11 января 2020

Использование регулярного выражения:

output <- with(df, ifelse(nchar(crime) == 6, sub("(..).*", "\\1", crime), 
                                             sub("(.).*", "\\1", crime)))
output
#[1] "11" "17" "9"  "26" "6"  "5" 

С str_extract из stringr

with(df, ifelse(nchar(crime) == 6, stringr::str_extract(crime, ".."),
                                   stringr::str_extract(crime, ".")))
становится немного проще
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...