簡體   English   中英

將行應用於名義行之間的值

[英]Apply row to values between nominal rows

我毫不懷疑以前有人問過這個問題,但我一生都無法弄清楚如何以一種我能找到答案的方式來表達它。

我有以下數據來自 a.csv

1 Q1. Do you run on trails?                                                                                    NA     NA   
2 YES                                                                                                          97.17% 2507 
3 NO                                                                                                           2.83%  73   
4 Q2. Do you participate in organized trail work, maintenance, building, or cleaning up trails (ie: plogging)? NA     NA   
5 YES                                                                                                          49.88% 1283 
6 NO                                                                                                           50.12% 1289 

問題和可能的回答不盡相同,所以我想象的工作流程是:

  • 對於匹配“Q\\D?”的每一行
  • 用該值寫一列
  • 對於下一場比賽之前的每一行。

理想情況下,最終結果將是:

Q1...   YES  10% 435
Q1...   NO   90% 783
Q2...   YES  10% 435
Q2...   NO   90% 783

對不起,我不得不編輯,我終於明白了

  1. 將您的工作表保存為 csv 使用,作為分隔符和 ' 作為字符串分隔符。

  2. 運行此代碼

請交流任何疑慮或疑問。 請注意,我使用readLines()將文件作為文本讀取,然后使用冒號字符將它們分開,除了在問題中我使用字符串分隔符的地方。 它很臟,但它可以工作。

最好的

JA

  • 加載包
library(data.table)
library(stringr)
  • 以文本形式讀取數據
dat <- readLines("~/Documents/test.SO/test1.csv")
  • 使用 grep 確定哪些行是問題,這很重要,因為我們將循環遍歷這些行:前提是:從每個問題行到下一個問題行,所有行都必須是答案。
qlines <- grep("Q[0-9]\\.", dat)
  • 只需設置一個空列表來存儲問題,並為我們要存儲的列表元素設置一個計數器
all.questions <- list()
i <- 1

-現在這是甜蜜的東西:按步驟:

  • S1:我們提取問題本身的文本,我們使用dat[q]執行此操作,因為我們正在循環 q,因為我們已經知道問題所在的行。 請記住,從這一行到下一行都是答案,除非這是最后一個問題,否則從這一行到最后一行都是答案,這就是 if 存在的原因。 子只是在您用來存儲的字段分隔符之間提取,即'
  • S2:用答案分開文本行,其中應包含答案本身、百分比和回答的人數。 使用unlist(str_split(dat[a], ","))我們將行分成一個字符向量,每個“,”是字段分隔符。 然后我們有一個字符向量,我們知道它包含如上所述的有序信息。 從這里我們做ans.dat[1]我們知道是答案本身,然后下一個元素是百分比等等。 我們正在做percent <- ans.dat[2]的事情,分配給一個變量,只是慢慢地從該文本行中提取信息,所以最后我們可以構建一個包含我們喜歡的元素的表格。
  • S3:現在我們有了我們想要的單獨元素,我們組裝了一行我們想要的表格,記住這個內部循環是針對每個答案的,這是那個答案的行,語法就是 data.table 語法。 (對不起,我不再熟悉 data.frames 語法。我們 rbind-it。

內部循環將耗盡此問題的答案 外部循環將耗盡文本的問題。

旁注,我可以通過在內部循環關閉后添加第二個 sub 來消除剩余的冒號: question <- gsub("( |,)$", "", question)

for(q in qlines){

  question <- sub(".*'([^']*)'.*", "\\1", dat[q]) #S1

  if(which(q==qlines) == length(qlines)){
    ans.lines <- (q+1):length(dat)
  }else{
    ans.lines <- (q+1) : (qlines[which(qlines==q)+1] - 1)
  }

  all.answers <- data.table()

  for(a in ans.lines){

   ans.dat <-  unlist(str_split(dat[a], ",")) #S2
   ans <- ans.dat[1]
   percent <- ans.dat[2]
   responders <- ans.dat[3]
   ans.row <- data.table("ans"=ans, "percent"=percent, "responders"=responders) #S3
   all.answers <- rbind(all.answers, ans.row)

  }

  all.questions[[i]] <- question.table <- cbind(question, all.answers)
  i <- i+1

}

all.questions

[[1]]
                       question ans percent responders
1: Q1. Do you run on trails? ,, YES      50        100
2: Q1. Do you run on trails? ,,  NO      50        100

[[2]]
                                                                                                       question ans percent responders
1: Q2. Do you participate in organized trail work, maintenance, building, or cleaning up trails (ie: plogging)? YES      50        100
2: Q2. Do you participate in organized trail work, maintenance, building, or cleaning up trails (ie: plogging)?  NO      50        100

[[3]]
                    question    ans percent responders
1: Q3. What is your gender,,   MALE      50        100
2: Q3. What is your gender,, FEMALE      49         99
3: Q3. What is your gender,,  OTHER       1          1

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM