1

我正在为我的梦幻足球联赛做一些事情。我填充了一系列数据框,每个都以位置命名(例如,四分卫的 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

4 回答 4

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)

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

positions <- list(QB=QB, RB=RB, TE=TE)
positions <- lapply(positions, function(x) { x$Player <- fixit(x$Player) } )
于 2013-09-24T15:41:24.930 回答
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',...)

于 2013-09-24T15:41:47.327 回答
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
于 2013-09-24T15:33:42.353 回答
0

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

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

不过,我不禁想到,通过名称作为字符串来操作这些对象可能不是解决整个问题的最干净的方法。

于 2013-09-24T15:35:56.363 回答