Прочитать файл.csv с именами и метками в R

У меня есть файл.csv, который мне нужно прочитать в R. Первая строка содержит имена (например, BFI1, BFI2, CAQ2), а вторая строка содержит вопрос, к которому я также хотел бы получить доступ в R (например, "Мне нравится" Ходить на вечеринки"). Каждый ряд после первых двух соответствует одному участнику.

Я хотел бы иметь возможность получить доступ к кодам и тексту в R. (например, использовать grep получить доступ ко всем вопросам из одного опроса, а также просмотреть текст пункта при необходимости. Мне нужно, чтобы числовые ответы были числовыми.

BFI1, BFI2, CAQ1, CAQ2
Likes to read, Enjoys Parties, Is Nervous, Loves Books
3, 7, 1, 4
4, 5, 3, 3

Я хочу прочитать это так, чтобы я мог получить доступ либо к именам (строка 1), либо к тексту (возможно, с метками). Я посмотрел на Hmisc пакет, но их функциональность метки кажется ограниченной.

Есть ли способ прочитать в этом файле.csv и получить доступ к обоим этим значениям?

4 ответа

Основываясь на ответе Мишель Усуелли и с поправкой Рича Скривена, вы можете написать эту функцию:

read_csv_with_labels <- function(fileName)
{
 library(Hmisc)

 # read the first two lines
 varNames <- read.csv(fileName, nrows = 1, stringsAsFactors = FALSE, header = FALSE)
 varLabels <- read.csv(fileName, nrows = 1, stringsAsFactors = FALSE, header = TRUE)

 # read the data
 df <- read.csv(fileName, skip = 2)

 # assign variable names and labels to the dataframe
 names(df) <- varNames
 label(df) <- varLabels 

 return(df)
}

Я думаю, что это должно быть включено в базовую функциональность read.csv и read_csv.

Не уверен, что у вас все в порядке с наличием меток в качестве отдельного вектора, но вот идея. Предположим, ваше имя файла x.txt

## set up an argument list for scan() - just to avoid repetition
scanArgs <- list(
    file = "x.txt", what = "", nlines = 1, sep = ",", strip.white = TRUE
)

## read the data with no header and add the first line as names
df <- setNames(
    read.table("x.txt", skip = 2, sep = ","), 
    do.call(scan, scanArgs)
)
#   BFI1 BFI2 CAQ1 CAQ2
# 1    3    7    1    4
# 2    4    5    3    3

## make the label vector
labels <- setNames(do.call(scan, c(scanArgs, skip = 1)), names(df))
#            BFI1             BFI2             CAQ1             CAQ2 
# "Likes to read" "Enjoys Parties"     "Is Nervous"    "Loves Books" 

Таким образом, элементы в labels соответствуют столбцам в df и столбцы являются числовыми.

Обратите внимание, что x.txt был создан с

txt <- 'BFI1, BFI2, CAQ1, CAQ2
Likes to read, Enjoys Parties, Is Nervous, Loves Books
3,7,1,4
4,5,3,3'
writeLines(txt, "x.txt")

Вы можете использовать nrows и пропустить аргументы или read.csv

nameFile <- "data.csv"

# read the first two lines
vectorNames <- read.csv(nameFile, nrows = 1)
vectorDescription <- read.csv(nameFile, nrows = 1, skip = 1)

# read the data
dfIn <- read.csv(nameFile, skip = 2)
names(dfIn) <- vectorNames

@Richard Scriven Я использовал твой код и следил за этим с помощью пакета

library(Hmisc)
y=data.frame(temp=rep(NA,nrow(df)))  
for (i in 1:length(labels)){  
x=df[,i]  
label(x)=labels[i]   
y[names(df)[i]]=x  
}  
y$temp=NULL  
y  
#  BFI1 BFI2 CAQ1 CAQ2
# 1    3    7    1    4
# 2    4    5    3    3
label(y)
#            BFI1             BFI2             CAQ1             CAQ2 
# "Likes to read" "Enjoys Parties"     "Is Nervous"    "Loves Books" 
Другие вопросы по тегам