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

我可以想到两种方法来解决这个问题。一个是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"))
于 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))

显然,你可以把它变成一个讨厌的单行:

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

这是使用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))
于 2011-07-05T22:04:20.197 回答
0

另一个使用 paste() 的 hack,绝对没有那么优雅,但它完成了工作。

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 回答