如何替换R中动态命名的数据框中的列

时间:2013-09-24 15:19:10

标签: r stringr

我正在为我的梦幻足球联赛做一些事情。我填充了一系列数据框,每个数据框都以位置命名(例如,四分卫的QB,跑卫的RB等)

我已经能够使用apply()函数将一个位置的单独块链接到一个数据帧中做了很多工作,但我真正想做的是从某些东西中删除一些文本每个职位。

所以我有一个名为QB的数据帧,其中一个列叫做Player,它有一些我想删除的多余文本。

所以,如果我这样做,那就有效:

thePosNick <- "QB"
thePlayer <- paste(thePosNick, "$Player", sep="")
g <- str_replace(eval(parse(text=thePlayer)), "remove this text", "")
g <- str_replace(g, "more meaningless text", "")
g <- str_trim(g)
#expected behavior:
QB$Player <- g

这很好,但是,我很乐意能够动态地执行此操作,并且执行以下操作似乎不起作用:

thePosNick <- "QB"
thePlayer <- paste(thePosNick, "$Player", sep="")
g <- str_replace(eval(parse(text=thePlayer)), "remove this text", "")
g <- str_replace(g, "more meaningless text", "")
g <- str_trim(g)
#but i'd love to be able to do something like this:
assign(thePlayer, value=g)

谁能告诉我我做错了什么?非常感谢任何建议,谢谢!

4 个答案:

答案 0 :(得分:4)

首先,我做了一个功能来修复。

fixit <- function(g) {
  g <- str_replace(g, "remove this text", "")
  g <- str_replace(g, "more meaningless text", "")
  g <- str_trim(g)
  g
}

然后get您想要的变量,修复它,然后再回复assign

thePosNick <- "QB"
x <- get(thePosNick)
x$Player <- fixit(x$Player)
assign(thePosNick, x)

或者,更常用的方法是使用列表来存储所有位置,而不是仅将它们存储在全局环境中。然后你可以使用lapply一次修复它们。

positions <- list(QB=QB, RB=RB, TE=TE)
positions <- lapply(positions, function(x) { x$Player <- fixit(x$Player) } )

答案 1 :(得分:3)

存放这样的东西?

biglist = list(QB=list(Player='yo remove this text here'))

# $QB
# $QB$Player
# [1] "yo remove this text here"

然后

g <- biglist[[thePosNick]][['Player']]
biglist[[thePosNick]][['Player']] <- str_replace(g, "remove this text", "")

# $QB
# $QB$Player
# [1] "yo  here"

也就是说,您可以将内容的名称放在[[]]中。我估计你只会遇到在全局环境中分配东西的麻烦(而不是嵌套在列表中)。

评论。正如@Roland所说,你最好把它存储在data.frame或data.table中,也许每个玩家有一行:DF <- data.frame(Player='You',Pos='QB',Team='Youse',...)

答案 2 :(得分:1)

您必须使用

eval(parse(text=paste(thePlayer,"<-",deparse(g))))

而不是assign(thePlayer, value=g)

为什么呢?由于QB$Player <- g不是直接分配,而是对函数'$<-'的调用,该函数将g中的值置于对象QB的特殊位置。您的环境中没有对象QB$Player,这就是assign()失败的原因。

观点:

这一切都非常糟糕,因为更好的解决方案是使用这样的数据帧列表:

L <- list(QB=QB, RB=RB, ...)

g <- str_replace(L[["QB"]]$Player, "remove this text", "")
g <- str_replace(g, "more meaningless text", "")
g <- str_trim(g)
L[["QB"]]$Player <- g

答案 3 :(得分:0)

一个快速而肮脏的解决方案是

eval(parse(text=paste(thePlayer,"<-g",sep="")))

我不禁想到,虽然用字符串操纵这些对象作为字符串可能不是解决整个问题的最简洁方法。