如何将字符串转换为R中的赋值语句?

问题描述 投票:2回答:2

列表中有许多列。我想使用一些功能自动工作。

我有一个data.frame myData

没有myData$home_player_X。我手动逐个添加它。

如果我手动执行,代码如下所示:

myData$home_player_1 <- lDataFrames[[3]]$home_player_1
myData$home_player_2 <- lDataFrames[[3]]$home_player_2
...
myData$home_player_11 <- lDataFrames[[3]]$home_player_11

如果我们只考虑<-之后的部分,我可以将其转换为表达式:

eval(parse(text=paste("lDataFrames[[3]]$home_player_",i,sep="")))

但我想转换整个字符串。整个字符串是这样的:

paste("myData$home_player_",i," <- lDataFrames[[3]]$home_player_", i,sep="")

我想将字符串转换为赋值语句,所以我可以在for循环中执行它

r eval paste
2个回答
0
投票

不要使用$表示法,只需使用变量名称作为索引。我用Y代替你的lDataFrames[[3]],但它应该很容易翻译。

myData = data.frame(Var1 = 1:10)
Y = data.frame(home_player_1 = 11:20, 
    home_player_2 = 21:30, home_player_3 = 31:40)

for(i in 1:3) {
    VarName = paste0("home_player_", i)
    myData[ ,VarName] = Y[ ,VarName]
}

myData
   Var1 home_player_1 home_player_2 home_player_3
1     1            11            21            31
2     2            12            22            32
3     3            13            23            33
4     4            14            24            34
5     5            15            25            35
6     6            16            26            36
7     7            17            27            37
8     8            18            28            38
9     9            19            29            39
10   10            20            30            40

1
投票

您可以直接复制mydata中所需的列,而不是使用字符串。

cols <- grep("^home_player", names(lDataFrames[[3]]), value = TRUE)
mydata[cols] <- lDataFrames[[3]][cols]

使用可重复的例子,

df <- data.frame(home_player_1 = 1:5, home_player_2 = 6:10, home_player_3 = 11:15)
cols <- grep("^home_player", names(df), value = TRUE)
mydata <- data.frame(matrix(nrow = nrow(df), ncol = length(cols), 
          dimnames = list(NULL, cols)))
mydata[cols] <- df[cols]

mydata
#  home_player_1 home_player_2 home_player_3
#1             1             6            11
#2             2             7            12
#3             3             8            13
#4             4             9            14
#5             5            10            15
© www.soinside.com 2019 - 2024. All rights reserved.