我有一个包含数十列和数千行的数据集。 在这里,我仅提供一个玩具示例: 我要做的第一件事是为每个trN样条内插varX列,作为列tt的函数。 这是很容易做到与操作ddply从plyr包。 但是,假设我还想更改新数据框的尺寸(行数)。 例如,我想拥有一组值,该值指定要在哪里进行 ...
提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供 中文繁体 英文版本 中英对照 版本,有任何建议请联系yoyou2525@163.com。
正如标题所说,我正在尝试将 dataframe 中的元素从一个字符更改为另一个字符。 dataframe如下:
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 function 应用于整个 dataframe?
我在想一些事情:
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)
如果有更高效或方便的方法,欢迎分享。
我可以想到两种方法来解决这个问题。 一种是像你一样使用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"))
从这样的 function 定义开始
insertslash <- function(x) sapply(strsplit(x, ""), function(x) paste(x, collapse="/"))
通过insertslash(g1)
说服自己它应该做的事情。
要将其应用于 dataframe 的所有列,请执行以下操作:
as.data.frame(apply(df, 2, insertslash))
显然,你可以把它变成一个讨厌的单行:
as.data.frame(apply(df, 2, function(x) sapply(strsplit(x, ""), function(x) paste(x, collapse="/"))))
这是使用gsub
的一些技巧。 对正则表达式了解更多的人应该能够对此进行改进:
mySplit <- function(x)
{
substr(gsub("","/",x),2,4)
}
as.data.frame(apply(df,2,mySplit))
您最初的解决方案不起作用的原因是您在错误的位置unlist
。 因此,如果您稍后lapply
unlist
事情会按您的预期工作:
mySplit1 <- function(x)
{
unlist(lapply(strsplit(x,""),paste,collapse="/"))
}
as.data.frame(apply(df,2,mySplit1))
另一个使用 paste() 的 hack,绝对没有那么优雅,但它完成了工作。
for (col in 1:ncol(df)){
df[,col] = paste(substr(df[,col],1,1),"/",substr(df[,col],1,1), sep="")
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.