2014-12-20 5 views
2

это моя ситуация: У меня есть dataframe, и я хочу применить функцию substr к каждому элементу определенного столбца. Колонку я хочу, чтобы манипулировать containes выражения, как:R: Применить substr к каждому элементу столбца dataframe

x = c("name1_01", "name2_02", "name3_01") 
df = data.frame(x) 
colnames(df) = ("Names") 
df["Names"] = sapply(df["Names"], as.character) 
df 
# Names 
# 1 name1_01 
# 2 name2_01 
# 3 name3_01 

Теперь я хочу, чтобы отрубить последние 3 цифры каждой записи в определенном столбце. я просто пытался SUBSTR, не мне, что я хочу:

df["Names"] = substr(df["Names"], 1,5) 
df["Names"] 
# Names 
# 1 c("name1 
# 2 c("name1 
# 3 c("name1 

Если я, однако, применяется SUBSTR к отдельным элементам, которые я делаю получить правильный результат:

df[1,"Names"] = substr(df[1,"Names"], 1,5) 
df[1,"Names"] 
# Names 
# [1,] "name1" 

Я уже пытался вокруг много (Я также пробовал использовать для субстрата), но я не понимаю. Я совершенно новичок в R и надеюсь, что решение совершенно очевидно ...

Благодарим всех вас заранее, Chris!

+1

'ФР [[ "Имена"]] <- SUBSTR (ДФ [[ "Имена" ]], 1, nchar (df [["Имена"]])) 3) 'ie использовать индексирование элемента списка' [['вместо' ['. По крайней мере, это то, что я делаю с кадрами данных :) –

+2

Совет: 'df' было бы гораздо легче создать с помощью' data.frame (Names = x, stringsAsFactors = FALSE) ' –

ответ

4

Попробуйте

substr(df[,'Names'], 1, nchar(df[,'Names'])-3) 

Или

sub('...$', '', df[,'Names']) 

sub('...$', '', as.character(df$Names)) 
#[1] "name1" "name2" "name3" 
+0

, почему здесь работает sub? не стоит ли ему заменять первое 'имя1_01' и оставлять остальных? – rawr

+1

@rawr Он должен работать, потому что мы заменяем специально три последних элемента для каждого элемента строки. Предположим, что шаблон отличается, например, для замены '_' в строке с несколькими' _'. то 'gsub' - это способ заменить все. 'sub ('_', '', 'name1_01_01') [1]" name101_01 "' – akrun

6

Использование mutate() из dplyr:

library(dplyr) 
df %>% 
    mutate(Names = substr(Names, 1, 5)) 
Смежные вопросы