【发布时间】:2021-05-18 20:48:41
【问题描述】:
提前致歉,但我在这里和 R 都是新手。我想做的是 自动 在数据框中添加一列,其中填充了实际名称数据框。例如,如果我有以下数据框:
> q103
a b c d
d 1 4 6 9
e 2 8 3 12
f 3 12 8 16
如何在每行中添加一个包含字符串 q103 的列的末尾(没有具体命名它,因为我需要对数百个数据帧重复此操作),这样我就结束了与:
> q103
a b c d X
d 1 4 6 9 q103
e 2 8 3 12 q103
f 3 12 8 16 q103
问题是这些数据框有很多,并且它们在列表列表中(例如,像 List[[list]][["q100277']] 是一个数据列表中的框架)。此外,它们的名称有些随机,但保留很重要(我不能只是按顺序重命名它们)。所以,我需要一种方法来告诉 R 基本上“查看数据框 X 的名称并将该字符串添加到数据框中的新列中,然后对列表中的每个数据框执行此操作”)。感觉某种 lapply 会起作用,但我不知道实际告诉它要做什么为了到达那里。
非常感谢您在弄清楚如何将一列放入每个数据帧中的任何帮助
编辑:我尝试在下面创建一个可重现的示例(每个 cmets)。这将创建类似于我正在查看的内容(除了示例是一个小得多的列表!)
library(CTT)
library(dplyr)
library(tidyverse)
library(purrr)
## Create student response patterns for a fake test
q102 <- c("A", "B", "C", "D", "O", "A", "A", "C", "D", "A", "C", "D", "O", "D", "A", "B", "A", "C", "D", "A")
q107 <- c("C", "D", "O", "D", "A", "B", "A", "C", "D", "A", "A", "B", "C", "D", "O", "A", "A", "C", "D", "A")
q1045 <- c("B", "O", "C", "A", "D", "B", "O", "C", "A", "D", "B", "O", "C", "A", "D", "B", "O", "C", "A", "D")
q101 <- c("A", "B", "C", "D", "O", "A", "A", "C", "D", "A", "B", "O", "C", "A", "D", "B", "O", "C", "A", "D")
q1064 <- c("C", "D", "O", "D", "A", "B", "A", "C", "D", "A", "A", "B", "C", "D", "O", "A", "A", "C", "D", "A")
q104 <- c("A", "B", "C", "D", "O", "A", "A", "C", "D", "A", "B", "O", "C", "A", "D", "B", "O", "C", "A", "D")
## Create an assessment key to identify the test
AssessmentKey <- c("ADW", "ADW", "ADW", "ADW", "ADW", "ADW", "ADW", "ADW", "ADW", "ADW", "ADW", "ADW", "ADW", "ADW", "ADW", "ADW", "ADW", "ADW", "ADW", "ADW")
## Assign response pattern to the assessment key
Students1 <- data.frame(q102, q107, q1045, q101, q1064, q104, AssessmentKey)
remove(AssessmentKey)
## Create a second assessment key to identify a different test
AssessmentKey <- c("XYZ", "XYZ", "XYZ", "XYZ", "XYZ", "XYZ", "XYZ", "XYZ", "XYZ", "XYZ", "XYZ", "XYZ", "XYZ", "XYZ", "XYZ", "XYZ", "XYZ", "XYZ", "XYZ", "XYZ")
## Assign the response pattern to the second assessment key
Students2 <- data.frame(q102, q107, q1045, q101, q1064, q104, AssessmentKey)
remove(q102, q107, q1045, q101, q1064, q104, AssessmentKey)
## Create a data frame combining the two different assessments
StudentAnswers <- rbind(Students1, Students2)
## Create a data frame with the answer key for both tests
AnswerKey <- c("A", "B", "A", "A", "C", "D", "A", "B", "A", "A", "C", "D")
QuestionKey <- c("q102", "q107", "q1045", "q101", "q1064", "q104",
"q102", "q107", "q1045", "q101", "q1064", "q104")
AssessmentKey <- c("ADW", "ADW", "ADW", "ADW", "ADW", "ADW", "XYZ", "XYZ", "XYZ", "XYZ", "XYZ", "XYZ")
AnswerKeys <- data.frame(QuestionKey, AnswerKey, AssessmentKey)
remove(AnswerKey, QuestionKey, AssessmentKey)
X <- c("ADW", "XYZ")
y <- lapply(
(X), function(x)
{
## This will filter the data file to a specific assessment and
## select the columns needed for analysis
StudentResponse <- StudentAnswers %>%
dplyr::filter(AssessmentKey == x) %>%
dplyr::select(q102, q107, q1045, q101, q1064, q104)
AKey <- AnswerKeys %>%
dplyr::filter(AssessmentKey == x) %>%
dplyr::select(AnswerKey)
## using safely from the purr package to run the distractorAnalyis
## function from CTT in case of errors
safeDA = safely(.f=distractorAnalysis)
safeDA(StudentResponse, AKey)
}
)
## This part removes the empty "error" data frames from the list generated above.
Z <- c(1:length(y))
Results <- lapply(
(Z), function(Z)
{ y[[Z]][["result"]]
})
【问题讨论】:
-
你能提供一个小的reproducible example吗?具体来说,这将有助于了解数据帧是否处于不同的深度以及它们的深度。像
imap和purrr这样的函数可以轻松地遍历列表的名称及其内容,但具体如何调用它取决于嵌套列表的设置。 -
您的数据是否类似于
a <- head(mtcars); list(list(name1=a, name2=a))?一个例子可以是非常简单的,告诉我们如何回答你的问题。 -
用一个示例更新了帖子,该示例将生成与我正在使用的列表类似的列表(尽管长度更短)