Извлечение данных из сложного файла .txt с помощью r

Я не программист и мало что знаю о коде; Я исследователь. Я использовал

У меня есть 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)

Проблема: этот код записывает все правильные переменные, которые мне нужны, но неправильно записывает значения для каждой переменной и участника. Он повторяет значения для первого участника для каждого участника. Собственные уникальные данные каждого участника необходимо извлечь без каких-либо изменений.

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
97
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Используйте 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                    |"
)

Другие вопросы по теме