R Изменение элементов в кадре данных - PullRequest
2 голосов
/ 06 июля 2011

Я пытаюсь, как говорится в заголовке, изменить элементы из моего кадра данных с одного символа на другой. Кадр данных выглядит следующим образом:

g1=c("CC","DD","GG")
g2=c("AA","BB","EE")
g3=c("HH","II","JJ")

df=data.frame(g1,g2,g3)

Я хочу преобразовать элементы из формата письма в формат буквы / буквы (например, CC в C / C или AA в A / A)

Я знаю, что использование "strsplit" будет работать со списком. Я также знаю, что мне нужно как-то включить: collapse = "/"

Как бы я мог применить функцию strsplit ко всему фрейму данных?

Я думал о чем-то вроде:

split=function(x)
{
  unlist(paste(strsplit(x,""),collapse="/"))
}

j=as.data.frame(apply(df,1,split))

но это не дает желаемых результатов.

Обновление ---------------- Видимо, работает следующий скрипт:

split=function(x)
{
  paste(unlist(strsplit(x,"")),collapse="/")
}

p=apply(df,c(1,2),split)

Если есть более эффективный или удобный способ, пожалуйста, не стесняйтесь поделиться.

Ответы [ 4 ]

6 голосов
/ 06 июля 2011

Я могу придумать два способа приблизиться к этому. Один использует strsplit, как вы сделали. Вам не хватало только той части, где вы перебираете каждый элемент в списке, возвращенном из strsplit:

Split <- function(x) {
  #unlist(lapply(strsplit(x, ""), paste, collapse="/"))
  sapply(strsplit(x, ""), paste, collapse="/")
}
as.data.frame(lapply(df, Split))

Другой подход заключается в использовании gsub и символа \\B, который соответствует пустой строке, которая не находится в начале или конце слова.

as.data.frame(lapply(df, gsub, pattern="\\B", replacement="/"))

То, что составляет «слово», зависит от локали и реализации, поэтому вот еще одно решение, использующее gsub и обратные ссылки.

as.data.frame(lapply(df, gsub, pattern="(.)(.)", replacement="\\1/\\2"))
2 голосов
/ 06 июля 2011

Начните с определения функции, подобной этой

insertslash <- function(x) sapply(strsplit(x, ""), function(x) paste(x, collapse="/"))

Убедитесь, что она делает то, что должна, с помощью insertslash(g1).

Чтобы применить ее ко всем столбцам информационного кадра, сделайте это:

as.data.frame(apply(df, 2, insertslash))

Очевидно, вы можете свернуть это в одну неприятную однострочную строку:

as.data.frame(apply(df, 2, function(x) sapply(strsplit(x, ""), function(x) paste(x, collapse="/"))))
1 голос
/ 06 июля 2011

Вот немного хака с использованием gsub.Кто-то, кто знает больше о регулярных выражениях, должен быть в состоянии улучшить это:

mySplit <- function(x)
{
  substr(gsub("","/",x),2,4)
}

as.data.frame(apply(df,2,mySplit))

Причина, по которой ваше оригинальное решение не работало, заключалась в том, что вы unlist находились в неправильном месте.Поэтому, если вы unlist позже и используете lapply, все будет работать так, как вы ожидаете:

mySplit1 <- function(x)
{
  unlist(lapply(strsplit(x,""),paste,collapse="/"))
}

as.data.frame(apply(df,2,mySplit1))
0 голосов
/ 06 июля 2011

Еще один хак с использованием paste (), определенно не такой элегантный, но он выполняет свою работу.

for (col in 1:ncol(df)){
  df[,col] = paste(substr(df[,col],1,1),"/",substr(df[,col],1,1), sep="")
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...