2016-01-11 2 views
3

У меня есть файл csv следующим образом.Как преобразовать значения столбца в проценты

Student Name English  Evs   Mathematics 
       Term 1  Term 1  Term 1 
      Score (150) Score (150) Score (150) 
Abhinav.S  107.75 117.25   95.5 
Abhishek.C  112.5 88.75   91  
Aditya    117 116.5   98  

мне нужно преобразовать это в процентах, не нарушая набор данных, формула будет (получена оценка/общий балл) * 100.

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

+0

Используйте 'read.csv()', а затем умножьте полученный кадр данных на '0.6666' или' 2/3'. Чтение в вашем файле может быть беспорядочным из-за способа его форматирования, и вы можете немного его почистить. –

+0

Спасибо, Тим, но у меня 20 файлов csv с разными максимальными значениями. Сложно ли это сделать? – Ram

+0

У всех файлов есть три строки? Все ли они имеют четыре столбца, разделенные пробелами, причем первые содержат имена, а последние три содержат данные? –

ответ

1

Следующий скрипт читает в вашем входном файле и создает фрейм данных, содержащий последние три строки, которые содержат ваши числовые данные. После масштабирования оценок до 100% масштаба он создает выходной файл с обновленными значениями. Форматирование в выходном файле может не совпадать точно.

all_content = readLines("filein.txt") 
temp_content <- all_content[4:6] 

dat = read.table(textConnection(temp_content), header = FALSE, 
       stringsAsFactors = FALSE, sep="") 

> dat 
      V1  V2  V3 V4 
1 Abhinav.S 107.75 117.25 95.5 
2 Abhishek.C 112.50 88.75 91.0 
3  Aditya 117.00 116.50 98.0 

dat[1:3, 2:4] <- dat[1:3, 2:4] * (2/3) # convert to percentage 

> dat 
      V1  V2  V3  V4 
1 Abhinav.S 71.83333 78.16667 63.66667 
2 Abhishek.C 75.00000 59.16667 60.66667 
3  Aditya 78.00000 77.66667 65.33333 

# write out the first three lines to an output file 
output <- file("fileout.txt") 
writeLines(c(all_content[1], all_content[2], all_content[3]), output) 
close(output) 

# write out the updated data frame as the last three lines 
write.table(dat, file="fileout.txt", append=TRUE, col.names=FALSE, 
      row.names=FALSE, quote=FALSE) 
+0

Спасибо, Тим, это снова для одного файла? Если мне нужно обработать 20 файлов, мне нужно изменить долю 20 раз. – Ram

+0

Вы можете настроить простой цикл, который будет перебирать требуемое количество файлов. Возможно, вы захотите включить мой код в функцию. –

+0

Да, но если вы внимательно прочитаете комментарии, вам нужно извлечь разные баллы за 100% для каждого файла, этого не хватает в вашем ответе. – snaut

0

Вот решение, которое извлекает максимальные оценки формируют ваш файл, вы, возможно, придется изменить регулярное выражение в gsub или так, как вы прочитать файл, в соответствии с форматом данных.

# read fixed width formatted file 
test <- read.fwf("test.csv", widths=c(13, 25-13, 39-25, 52-39)) 

# use first 3 rows as header, convert to character, extract numbers 
header <- test[3, 2:4] 
header <- lapply(header, as.character) 
scores <- as.numeric(gsub("Score \\((.*)\\)", "\\1", header)) 

# use rest of dataset as data 
data <- test[4:nrow(test), ] 
data <- as.data.frame(lapply(data, as.character), stringsAsFactors = F) 

# divide by max score (you'll might want to do this in a loop/lapply) 
data$V2percent <- 100*as.numeric(data$V2)/scores[1] 
data$V3percent <- 100*as.numeric(data$V3)/scores[2] 
data$V4percent <- 100*as.numeric(data$V4)/scores[3] 
+0

Вы уверены, что ширина поля жесткого кодирования будет работать, так как на практике ширина может быть переменной? –

+0

Дорогой user1999873, это не работает для меня – Ram

+0

что именно не работает? можете ли вы дать вывод первой строки (чтение документа)? – snaut

Смежные вопросы