Я не программист и мало что знаю о коде; Я исследователь. Я использовал
У меня есть 14 переменных, которые мне нужны для извлечения данных от нескольких участников. Он организован по переменным: существуют различные таблицы для каждого участника по одной из переменных, за которыми следует тот же набор таблиц для следующего участника по той же переменной, который повторяется для каждого участника, затем он переходит к следующей переменной и продолжает действовать по этой схеме.
Эти данные мне нужно извлечь и поместить в файл .csv. Позже я объясню, как должен выглядеть файл .csv.
Вот как выглядит файл .txt для двух из 14 переменных, для первых двух участников каждой.
Participant Private ID = 11450318.000000000
Case Processing Summarya
|--------------------------------|-------------------------------------------|
| |Cases |
| |-------------|---------------|-------------|
| |Valid |Missing |Total |
| |-----|-------|-------|-------|-----|-------|
| |N |Percent|N |Percent|N |Percent|
|--------------------------------|-----|-------|-------|-------|-----|-------|
|CC.FOR_Mean * CC.T1TimedAcc_Mean|15 |31.3% |33 |68.8% |48 |100.0% |
|----------------------------------------------------------------------------|
a Participant Private ID = 11450318.000000000
CC.FOR_Mean * CC.T1TimedAcc_Mean Crosstabulationa
Count
|----------------|-----------------------|-----|
| |CC.T1TimedAcc_Mean |Total|
| |------------------|----| |
| |.00 |1.00| |
|-----------|----|------------------|----|-----|
|CC.FOR_Mean|2.00|1 |1 |2 |
| |----|------------------|----|-----|
| |3.00|1 |2 |3 |
| |----|------------------|----|-----|
| |4.00|1 |0 |1 |
| |----|------------------|----|-----|
| |5.00|1 |2 |3 |
| |----|------------------|----|-----|
| |7.00|1 |1 |2 |
| |----|------------------|----|-----|
| |8.00|1 |2 |3 |
| |----|------------------|----|-----|
| |9.00|0 |1 |1 |
|----------------|------------------|----|-----|
|Total |6 |9 |15 |
|----------------------------------------------|
a Participant Private ID = 11450318.000000000
Symmetric Measuresa
|------------------------|-----|--------------------------|--------------|------------------------|
| |Value|Asymptotic Standard Errorb|Approximate Tc|Approximate Significance|
|------------------|-----|-----|--------------------------|--------------|------------------------|
|Ordinal by Ordinal|Gamma|.217 |.334 |.644 |.520 |
|------------------------|-----|--------------------------|--------------|------------------------|
|N of Valid Cases |15 | | | |
|-------------------------------------------------------------------------------------------------|
a Participant Private ID = 11450318.000000000
b Not assuming the null hypothesis.
c Using the asymptotic standard error assuming the null hypothesis.
Participant Private ID = 11450328.000000000
Case Processing Summarya
|--------------------------------|-------------------------------------------|
| |Cases |
| |-------------|---------------|-------------|
| |Valid |Missing |Total |
| |-----|-------|-------|-------|-----|-------|
| |N |Percent|N |Percent|N |Percent|
|--------------------------------|-----|-------|-------|-------|-----|-------|
|CC.FOR_Mean * CC.T1TimedAcc_Mean|16 |33.3% |32 |66.7% |48 |100.0% |
|----------------------------------------------------------------------------|
a Participant Private ID = 11450328.000000000
CC.FOR_Mean * CC.T1TimedAcc_Mean Crosstabulationa
Count
|----------------|-----------------------|-----|
| |CC.T1TimedAcc_Mean |Total|
| |------------------|----| |
| |.00 |1.00| |
|-----------|----|------------------|----|-----|
|CC.FOR_Mean|1.00|0 |1 |1 |
| |----|------------------|----|-----|
| |2.00|3 |1 |4 |
| |----|------------------|----|-----|
| |3.00|6 |2 |8 |
| |----|------------------|----|-----|
| |4.00|0 |1 |1 |
| |----|------------------|----|-----|
| |5.00|1 |0 |1 |
| |----|------------------|----|-----|
| |6.00|0 |1 |1 |
|----------------|------------------|----|-----|
|Total |10 |6 |16 |
|----------------------------------------------|
a Participant Private ID = 11450328.000000000
Symmetric Measuresa
|------------------------|-----|--------------------------|--------------|------------------------|
| |Value|Asymptotic Standard Errorb|Approximate Tc|Approximate Significance|
|------------------|-----|-----|--------------------------|--------------|------------------------|
|Ordinal by Ordinal|Gamma|.111 |.419 |.264 |.792 |
|------------------------|-----|--------------------------|--------------|------------------------|
|N of Valid Cases |16 | | | |
|-------------------------------------------------------------------------------------------------|
a Participant Private ID = 11450328.000000000
b Not assuming the null hypothesis.
c Using the asymptotic standard error assuming the null hypothesis.
Participant Private ID = 11450318.000000000
Case Processing Summarya
|----------------------------------|-------------------------------------------|
| |Cases |
| |-------------|---------------|-------------|
| |Valid |Missing |Total |
| |-----|-------|-------|-------|-----|-------|
| |N |Percent|N |Percent|N |Percent|
|----------------------------------|-----|-------|-------|-------|-----|-------|
|CC.FOR_Mean * CC.T2UntimedAcc_Mean|15 |31.3% |33 |68.8% |48 |100.0% |
|------------------------------------------------------------------------------|
a Participant Private ID = 11450318.000000000
CC.FOR_Mean * CC.T2UntimedAcc_Mean Crosstabulationa
Count
|----------------|-------------------------|-----|
| |CC.T2UntimedAcc_Mean |Total|
| |--------------------|----| |
| |.00 |1.00| |
|-----------|----|--------------------|----|-----|
|CC.FOR_Mean|2.00|1 |1 |2 |
| |----|--------------------|----|-----|
| |3.00|0 |3 |3 |
| |----|--------------------|----|-----|
| |4.00|1 |0 |1 |
| |----|--------------------|----|-----|
| |5.00|2 |1 |3 |
| |----|--------------------|----|-----|
| |7.00|1 |1 |2 |
| |----|--------------------|----|-----|
| |8.00|1 |2 |3 |
| |----|--------------------|----|-----|
| |9.00|0 |1 |1 |
|----------------|--------------------|----|-----|
|Total |6 |9 |15 |
|------------------------------------------------|
a Participant Private ID = 11450318.000000000
Symmetric Measuresa
|------------------------|-----|--------------------------|--------------|------------------------|
| |Value|Asymptotic Standard Errorb|Approximate Tc|Approximate Significance|
|------------------|-----|-----|--------------------------|--------------|------------------------|
|Ordinal by Ordinal|Gamma|.042 |.337 |.124 |.901 |
|------------------------|-----|--------------------------|--------------|------------------------|
|N of Valid Cases |15 | | | |
|-------------------------------------------------------------------------------------------------|
a Participant Private ID = 11450318.000000000
b Not assuming the null hypothesis.
c Using the asymptotic standard error assuming the null hypothesis.
Participant Private ID = 11450328.000000000
Case Processing Summarya
|----------------------------------|-------------------------------------------|
| |Cases |
| |-------------|---------------|-------------|
| |Valid |Missing |Total |
| |-----|-------|-------|-------|-----|-------|
| |N |Percent|N |Percent|N |Percent|
|----------------------------------|-----|-------|-------|-------|-----|-------|
|CC.FOR_Mean * CC.T2UntimedAcc_Mean|16 |33.3% |32 |66.7% |48 |100.0% |
|------------------------------------------------------------------------------|
a Participant Private ID = 11450328.000000000
CC.FOR_Mean * CC.T2UntimedAcc_Mean Crosstabulationa
Count
|----------------|-------------------------|-----|
| |CC.T2UntimedAcc_Mean |Total|
| |--------------------|----| |
| |.00 |1.00| |
|-----------|----|--------------------|----|-----|
|CC.FOR_Mean|1.00|1 |0 |1 |
| |----|--------------------|----|-----|
| |2.00|1 |3 |4 |
| |----|--------------------|----|-----|
| |3.00|3 |5 |8 |
| |----|--------------------|----|-----|
| |4.00|0 |1 |1 |
| |----|--------------------|----|-----|
| |5.00|0 |1 |1 |
| |----|--------------------|----|-----|
| |6.00|1 |0 |1 |
|----------------|--------------------|----|-----|
|Total |6 |10 |16 |
|------------------------------------------------|
a Participant Private ID = 11450328.000000000
Symmetric Measuresa
|------------------------|-----|--------------------------|--------------|------------------------|
| |Value|Asymptotic Standard Errorb|Approximate Tc|Approximate Significance|
|------------------|-----|-----|--------------------------|--------------|------------------------|
|Ordinal by Ordinal|Gamma|.095 |.420 |.226 |.821 |
|------------------------|-----|--------------------------|--------------|------------------------|
|N of Valid Cases |16 | | | |
|-------------------------------------------------------------------------------------------------|
a Participant Private ID = 11450328.000000000
b Not assuming the null hypothesis.
c Using the asymptotic standard error assuming the null hypothesis.
All 14 variables are:
CC.FOR_Mean * CC.T1TimedAcc_Mean
CC.FOR_Mean * CC.T2UntimedAcc_Mean
CC.FOR_Mean * CC.LogRT.T2Untimed_Mean
CC.FOR_Mean * CC.AnsChange_Mean
NC.FOR_Mean * NC.T1TimedAcc_Mean
NC.FOR_Mean * NC.T2UntimedAcc_Mean
NC.FOR_Mean * NC.LogRT.T2Untimed_Mean
NC.FOR_Mean * NC.AnsChange_Mean
CW.FOR_Mean * CW.T1TimedAcc_Mean
CW.FOR_Mean * CW.T2UntimedAcc_Mean
CW.FOR_Mean * CW.LogRT.T2Untimed_Mean
CW.FOR_Mean * CW.AnsChange_Mean
FORAll_Mean * T1AccAll_Mean
FORAll_Mean * T2AccAll_Mean
И мне нужно значение гаммы, извлеченное для каждого участника в каждой переменной. Таким образом, для участника 11450328 в переменной CC.FOR_Mean CC.T2UntimedAcc_Mean это значение равно 0,095.
Существуют также отрицательные значения, которые необходимо учитывать.
Для первых двух переменных и первых двух участников я хочу, чтобы результирующий файл .csv выглядел следующим образом:
ParticipantPrivateID, CC.FORxCC.T1TimedAcc_Gamma, CC.FORxCC.T2UntimedAcc_Gamma,
11450318, .217, .042,
11450328, .111, .095,
Я также хочу, чтобы имена остальных переменных имели аналогичную структуру.
Опять же, я использовал для этого Это код, который лишь немного приблизился к тому, что мне нужно:
# Load required libraries
library(dplyr)
library(stringr)
# Define the file path
file_path <- "myfilepath"
# Read the file
lines <- readLines(file_path)
# Identify lines of interest
participant_lines <- grep("Participant Private ID = ", lines)
symmetric_measures_lines <- grep("Symmetric Measuresa", lines)
# Initialize a list to store data for each variable
data_list <- list()
# Define variables
variables <- c(
"CC.FORxT1TimedAcc_Gamma",
"CC.FORxT2UntimedAcc_Gamma",
"CC.FORxLogRT.T2Untimed_Gamma",
"CC.FORxAnsChange_Gamma",
"NC.FORxT1TimedAcc_Gamma",
"NC.FORxT2UntimedAcc_Gamma",
"NC.FORxLogRT.T2Untimed_Gamma",
"NC.FORxAnsChange_Gamma",
"CW.FORxT1TimedAcc_Gamma",
"CW.FORxT2UntimedAcc_Gamma",
"CW.FORxLogRT.T2Untimed_Gamma",
"CW.FORxAnsChange_Gamma",
"FORAllxT1AccAll_Gamma",
"FORAllxT2AccAll_Gamma"
)
# Initialize a dataframe to store the results
final_results <- data.frame(ParticipantPrivateID = character(), stringsAsFactors = FALSE)
# Function to extract data
extract_data <- function(variable_name, index, lines) {
participant_ids <- c()
gamma_values <- c()
for (i in seq_along(participant_lines)) {
# Extract participant ID
participant_id <- str_extract(lines[participant_lines[i]], "(?<=Participant Private ID = )[0-9]+")
# Initialize value for this participant
gamma_value <- NA
# Find corresponding Symmetric Measures line
if (index <= length(symmetric_measures_lines)) {
# The data should be in the line following "Symmetric Measuresa"
data_line_index <- symmetric_measures_lines[index] + 4 # Adjusted index for correct line
if (data_line_index <= length(lines)) {
# Extract the line
line_data <- lines[data_line_index]
# Extract numeric values, including those with '<'
numeric_values <- str_extract_all(line_data, "\\d*\\.\\d+|\\d+\\.\\d*|\\d+|<\\s*\\d*\\.\\d+|<\\s*\\d+")[[1]]
# Convert extracted values to numeric, handling special cases
converted_values <- sapply(numeric_values, function(x) {
if (grepl("^<", x)) {
return(NA) # Handle cases with '<' by returning NA
} else {
return(as.numeric(x))
}
})
# Check if we have the expected number of values
if (length(converted_values) >= 4) {
gamma_value <- converted_values[1]
}
}
}
# Store extracted values
participant_ids <- c(participant_ids, participant_id)
gamma_values <- c(gamma_values, gamma_value)
}
# Create a dataframe for the variable
data_df <- data.frame(
ParticipantPrivateID = participant_ids,
GammaValue = gamma_values,
stringsAsFactors = FALSE
) %>%
unique() # Ensure unique rows by ParticipantPrivateID
# Return the dataframe
return(data_df)
}
# Loop through each variable and extract data
for (i in seq_along(variables)) {
var_name <- variables[i]
index <- i
data_df <- extract_data(var_name, index, lines)
# Add variable column to the final results
final_results <- full_join(final_results, data_df, by = "ParticipantPrivateID")
colnames(final_results)[ncol(final_results)] <- var_name
}
# Display the final dataset
print(final_results)
# Save the final dataset to a CSV file
write.csv(final_results, "final_dataset.csv", row.names = FALSE)
Проблема: этот код записывает все правильные переменные, которые мне нужны, но неправильно записывает значения для каждой переменной и участника. Он повторяет значения для первого участника для каждого участника. Собственные уникальные данные каждого участника необходимо извлечь без каких-либо изменений.
Используйте readLines
для сбора данных, затем gsub
, grep
и read.table
для получения правильных строк, вставки их во фрейм данных и, наконец, pivot_wider
для получения желаемого широкого формата.
dat <- readLines("file.txt")
library(tidyr)
pivot_wider(data.frame(
ParticipantPrivateID = unique(gsub(".* = |\\.0+", "",
grep("Participant Private ID", dat, value=T))),
value = read.table(text=grep("Gamma", dat, value=T), sep = "|")[,4],
name = read.table(text=grep("CC\\..*Mean.*Total|
NC\\..*Mean.*Total|
CW\\..*Mean.*Total|
T[12]AccAll_Mean.*Total", dat, value=T),
sep = "|", strip.white=TRUE)[,3]
))
# A tibble: 2 × 3
ParticipantPrivateID CC.T1TimedAcc_Mean CC.T2UntimedAcc_Mean
<chr> <dbl> <dbl>
1 11450318 0.217 0.042
2 11450328 0.111 0.095
Обратите внимание, что я суммировал имена переменных, например. «CC\..*Mean.*Total» и т. д. и не проверяли другие переменные, отсутствующие в наборе данных игрушки, поэтому вам, возможно, придется их отрегулировать. Изменить переменные в полученном фрейме данных в соответствии с вашими потребностями можно с помощью colnames
.
Предположим, что file_path
и variables
из вопроса, и предположим, что файл содержит только строки, показанные в вопросе, или, если в файле есть все данные, раскомментируйте закомментированную строку v <- variables
. Компоненты variables
расположены в том же порядке, что и во входных данных, и мы предполагаем, что это так.
v
определяется как переменные, которые появляются во входных данных, и равно 2 для примера в вопросе, но для реальных данных это будут все переменные (см. закомментированную строку).
Прочитайте строки в lines
, извлеките строки, соответствующие указанному регулярному выражению, а затем из этих строк извлеките все числа, используя parse_number
. Преобразуйте это в матрицу из двух столбцов, а затем в фрейм данных.
Если этот фрейм данных имеет n строк и если есть переменные длины (v) (2 в вопросе), то есть участники n/длины (v), и первые строки n/длины (v) будут содержать значения первой переменной. для каждого участника вторые строки n/length(v) будут содержать значения второй переменной для каждого участника и так далее. Зная это, добавьте столбец для имен переменных.
Преобразуйте это из длинной формы в широкую, исправьте имя первого столбца и запишите его.
Предполагая, что все входные данные соответствуют одному и тому же шаблону, единственные необходимые изменения — это раскомментировать строку v <- variables
и добавить имя файла в строку write.csv
.
library(dplyr)
library(readr)
library(tidyr)
lines <- readLines(file_path)
v <- variables[1:2] # variables present - question has first 2
# v <- variables # uncomment for all variables
lines %>%
grep("^P.*ID|Gamma", ., value = TRUE) %>%
parse_number() %>%
matrix(ncol = 2, byrow = TRUE) %>%
as.data.frame %>%
mutate(name = rep(v, each = n() / length(v))) %>%
pivot_wider(id_cols = "V1", names_from = "name", values_from = "V2") %>%
rename(ParticipantPrivateID = "V1") %>%
write.csv(quote = FALSE, row.names = FALSE)
предоставление
ParticipantPrivateID,CC.FORxT1TimedAcc_Gamma,CC.FORxT2UntimedAcc_Gamma
11450318,0.217,0.042
11450328,0.111,0.095
Обратите внимание, что в целях тестирования мы могли бы использовать это вместо lines
, показанного в вопросе. Код, показанный выше, работает для этого, а также строки, показанные в вопросе, дают тот же результат.
lines <- c(
"Participant Private ID = 11450318.000000000",
"|Ordinal by Ordinal|Gamma|.217 |.334 |.644 |.520 |",
"Participant Private ID = 11450328.000000000",
"|Ordinal by Ordinal|Gamma|.111 |.419 |.264 |.792 |",
"Participant Private ID = 11450318.000000000",
"|Ordinal by Ordinal|Gamma|.042 |.337 |.124 |.901 |",
"Participant Private ID = 11450328.000000000",
"|Ordinal by Ordinal|Gamma|.095 |.420 |.226 |.821 |"
)