分配给R中的可变数据帧(Assign to a variable data frame in R)
我正在尝试将一列数据分配给现有数据框中的新列。 数据框在循环中改变,从scores.d到score.e。 我希望的输出是用scores.X $ new.col填充vals,其中X用当前dfname替换。
dfnames <- c("d","e") scores.d <- data.frame(x = 1, y = 1:10) scores.e <- data.frame(x = 2, y = 10:20) vals <- 60:70 for (i in seq_along(dfnames)){ assign(get(paste0("scores.",dfnames[i]))$new.col,vals) } Error in assign(get(paste0("scores.", dfnames[i]))$new.col, vals) : invalid first argument
这给了我一个错误,因为assign当我需要包含列名时,正在寻找一个字符串作为第一个参数。 只需将$ new.col添加到paste命令即可(假定$不会从字符串转换)。
我是R新手,不知道分配事情的注意事项。 我想制作一个数据框架列表,然后用vals填充每个数据框,但是它没有工作,因为我指定了特定的列,在我的真实数据中,数据框架无论如何都是预先存在的,我只是试图添加它们这里。 思考?
编辑* @贾森提供了一个答案,通过分配值给一个临时变量,然后分配回来。 为我的目的工作正常,但我曾尝试用字符串列表代替通过
paste0()
创建名称,它仍然给我错误。 首先,贾森的工作答案是:dfnames <- c("d","e") scores.d <- data.frame(x = 1, y = 1:10) scores.e <- data.frame(x = 2, y = 11:20) vals <- 61:70 for (i in dfnames){ #don't need seq_along dat<-get(paste0("scores.",i)) #pull up the data dat$new.col<-vals assign(paste0('scores.',i),dat) #replace old data frame with new }
现在有一个名称列表替换粘贴过程(请注意对seq_along的更改):
dfnames <- c("d","e") scores.d <- data.frame(x = 1, y = 1:10) scores.e <- data.frame(x = 2, y = 11:20) vals <- 61:70 # for demonstrative purposes only, these were created in a loop in my code full.dfnames[1] <- "Scores.d" full.dfnames[2] <- "Scores.e" for (i in seq_along(dfnames)){ #added seq_along back for the name index dat<-get(full.dfnames[i]) #pull up the data dat$new.col<-vals assign(full.dfnames[i],dat) #replace old data frame with new } >Error in assign(get(paste0("scores.", dfnames[i]))$new.col, vals) : invalid first argument
I am trying to assign a column of data to a new column in an existing data frame. The data frame changes in a loop, from scores.d, to scores.e. My desired output is to have scores.X$new.col populated with the vals, where X is replaced with the current dfname.
dfnames <- c("d","e") scores.d <- data.frame(x = 1, y = 1:10) scores.e <- data.frame(x = 2, y = 10:20) vals <- 60:70 for (i in seq_along(dfnames)){ assign(get(paste0("scores.",dfnames[i]))$new.col,vals) } Error in assign(get(paste0("scores.", dfnames[i]))$new.col, vals) : invalid first argument
This gives me an error, because assign is looking for a character string as the first argument, when I need it to include the column name. Simply adding $new.col to the paste command doesn't work (assume $ doesn't translate from string).
I am new to R and don't know the dos and don'ts of assigning things. I thought to make a list of data frames, then populate each with vals, but it didnt work as I am specifying particular columns, in my real data, the data frames are pre-existing anyway, I'm just trying to add to them here. Thoughts?
EDIT* @Jason has provided an answer, by allocating the values to a temporary variable, then assigning it back. Works fine for my purposes, however I had tried it with a list of strings in place of creating the names via
paste0()
, and it still gave me the error. First, Jason's working answer:dfnames <- c("d","e") scores.d <- data.frame(x = 1, y = 1:10) scores.e <- data.frame(x = 2, y = 11:20) vals <- 61:70 for (i in dfnames){ #don't need seq_along dat<-get(paste0("scores.",i)) #pull up the data dat$new.col<-vals assign(paste0('scores.',i),dat) #replace old data frame with new }
Now with a list of names replacing the paste procedure (note the change to seq_along):
dfnames <- c("d","e") scores.d <- data.frame(x = 1, y = 1:10) scores.e <- data.frame(x = 2, y = 11:20) vals <- 61:70 # for demonstrative purposes only, these were created in a loop in my code full.dfnames[1] <- "Scores.d" full.dfnames[2] <- "Scores.e" for (i in seq_along(dfnames)){ #added seq_along back for the name index dat<-get(full.dfnames[i]) #pull up the data dat$new.col<-vals assign(full.dfnames[i],dat) #replace old data frame with new } >Error in assign(get(paste0("scores.", dfnames[i]))$new.col, vals) : invalid first argument
原文:https://stackoverflow.com/questions/28891156
最满意答案
尝试以这种方式添加对日常工作表的引用:
With Sheets("Daily") .Cells(sonsat, 1) = TextBox1 'dot at the beginning is very important... .Cells(sonsat, 2) = TextBox2 .Cells(sonsat, 3) = TextBox3 .Cells(sonsat, 4) = TextBox4 .Cells(sonsat, 5) = TextBox5 end with
Try to add reference to Daily sheet in this way:
With Sheets("Daily") .Cells(sonsat, 1) = TextBox1 'dot at the beginning is very important... .Cells(sonsat, 2) = TextBox2 .Cells(sonsat, 3) = TextBox3 .Cells(sonsat, 4) = TextBox4 .Cells(sonsat, 5) = TextBox5 end with
相关问答
更多-
除了复制A1系列之外,我不知道最后的东西是什么,但我也把它放在那里。 您只需要在开始时分配工作簿对象(我的示例中的wrk,样本中的NewWB - 变量名称无关紧要),并告诉Copy方法复制的位置。 您将看到我指定了第一个参数 - 即:之前 - 作为wrk.Worksheets(1),因此复制的工作表将在新工作簿中的第一个工作表之前复制。 Sub Create_Work_Order() Dim currentWrk As Workbook Dim wrk As Workbook Set currentWrk ...
-
在代码的开始处添加此代码(Sub之后的第一行) Sub LabelCreation() Set aws = ActiveSheet 'aws is current active sheet Sheets.Add 'add a new sheet ActiveSheet.Name = "Labels" 'name it "labels" aws.Activate 'reactivate initial active sheet 'uses the active shee ...
-
将活动工作表保存到新工作簿(Save active sheet to new workbook)[2022-04-09]
这是我的想法: Sub SaveAsMacro() Dim strDir As String 'Show standard save as dialogue box With Application.FileDialog(msoFileDialogSaveAs) If .Show = -1 Then strDir = .SelectedItems(1) End If End With Application ... -
带范围的活动工作表副本(Active Sheet copy with Range)[2022-07-18]
要使用Range.Copy方法,您需要指定要将数据复制到的目标范围。 我已经使用注释更新了下面的代码,以显示如何将Range复制到新工作簿中的新工作表。 您需要将“WorksheetName”更改为包含您的数据的工作表的名称: Sub Save1() Dim wb As Excel.Workbook, wsSource As Excel.Worksheet, wsDest As Excel.Worksheet Dim NomFichier, Nom Nom = Day(Date) & "-" & Mont ... -
在活动工作表上插入数据(Insert data on active worksheet)[2022-03-12]
如果代码在Excel中,那么这将工作: Sub click() With ActiveSheet .Range("A1").Value = "Last Name" .Range("B1").Value = "First Name" .Range("A1:B1").Font.Bold = True .Range("A2").Value = "Doe" .Range("B2").Value = "John" End ... -
你需要将错误的回报从循环中拉出来,或者即使匹配也会得到至少20个假。 并且您不需要外部循环,因为FIND将整个范围视为一个。 Dim lnglastrow As Long Dim intnamemax As Integer Dim strName() As String Dim fnd As Boolean intnamemax = 21 ReDim strName(1 To intnamemax) strName(1) = "Bob Smith" strName(2) = "Rhys Jones ...
-
尝试以这种方式添加对日常工作表的引用: With Sheets("Daily") .Cells(sonsat, 1) = TextBox1 'dot at the beginning is very important... .Cells(sonsat, 2) = TextBox2 .Cells(sonsat, 3) = TextBox3 .Cells(sonsat, 4) = TextBox4 .Cells(sonsat, 5) = TextBox5 end with Tr ...
-
正如评论中所提到的,如果你没有利用它允许你将ws.Range (etc)简化为ws.Range的事实,你的With是没有意义的。 尝试将代码更改为: Sub SliceNDice() Dim objRegex As Object Dim X Dim Y Dim lngRow As Long Dim lngCnt As Long Dim tempArr() As String Dim strArr Set ws = ThisWorkbook.S ...
-
这应该是诀窍,编辑品味。 将宏保存到新模块,然后添加一个按钮Developer Tab> Insert> Button。 将按钮分配给此宏。 Sub SaveWorksheetsAsCsv() Dim WS As Excel.Worksheet Dim SaveToDirectory As String Dim CurrentWorkbook As String Dim CurrentFormat As Long CurrentWorkbook = ThisWorkbook.FullName Curr ...
-
当然: for sheetName in sheetNameList: ws_active = wb.get_sheet_by_name(sheetName) ws_active.append([1, 2, 3]) 或类似的规定。 Sure: for sheetName in sheetNameList: ws_active = wb.get_sheet_by_name(sheetName) ws_active.append([1, 2, 3]) Or something ...