Прочитать файл.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"