2

タイトルが示すように、データフレームの要素をある文字から別の文字に変更しようとしています。データフレームは次のとおりです。

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

4 に答える 4

6

これにアプローチするには2つの方法が考えられます。strsplit1つはあなたがしたように使用しています。から返されたリスト内の各要素をループする部分だけが欠けていました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"))
于 2011-07-05T22:09:17.990 に答える
2

このような関数定義から始めます

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

によって、本来あるべきことを行うことを自分自身に納得させてくださいinsertslash(g1)

データフレームのすべての列に適用するには、次のようにします。

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

明らかに、これを 1 つの厄介なワンライナーにまとめることができます。

as.data.frame(apply(df, 2, function(x) sapply(strsplit(x, ""), function(x) paste(x, collapse="/"))))
于 2011-07-05T22:17:45.293 に答える
1

Here's a bit of a hack using gsub. Someone who knows more about regex ought to be able to improve on this:

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

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

The reason your original solution wasn't working was because you were unlisting at the wrong spot. So if you unlist later and use lapply things work as you might expect:

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

as.data.frame(apply(df,2,mySplit1))
于 2011-07-05T22:04:20.197 に答える
0

paste() を使用した別のハック。間違いなくエレガントではありませんが、仕事は完了します。

for (col in 1:ncol(df)){
  df[,col] = paste(substr(df[,col],1,1),"/",substr(df[,col],1,1), sep="")
}
于 2011-07-05T22:16:53.613 に答える