从列名和列值创建字符串

时间:2016-09-20 13:04:35

标签: r

我有一个包含多列的数据框。第一列包含特定受访者的唯一标识符;列X1:n代表调查项目,其中被调查者被问到事实问题。空白值表示他们正确回答的问题。带有字母字母的单元表示他们给出的错误选项(即A到D)。 数据框的一个简单示例是:

d <- data.frame('Name'=c("Res1","Res2","Res3"),'1'=c("A","","A"),'2'=c("","B",""), '3'=c("","C","E"), '4' = c("D","D",""))

对于数据框中的每一行,我想将他们回答错误的问题与相应的问题和选定的答案粘贴到单个字符串变量中。我可以使用此变量向参与者反馈他们错过了哪些问题以及他们的错误回答。

我最初使用PASTE尝试了以下内容:

test4<- within(d, id<-paste(names(d[,2:5]), d[,2:5] ,sep = ".",collapse=","))

然而,它没有用。

我最终想要附加到每一行的末尾的是第一行的字符串(以及}之后的每一行:

  

“1.A 4.D”

2 个答案:

答案 0 :(得分:2)

dplyr / tidyr方法,将字符串作为d中的列重新获取:

library(dplyr)
library(tidyr)
d <- data.frame('Name'=c("Res1","Res2","Res3"),
                '1'=c("A","","A"),
                '2'=c("","B",""), 
                '3'=c("","C","E"), 
                '4' = c("D","D",""))


gather(d, question, response, -Name) %>%
  filter(response != "") %>%
  mutate(incorrect_string = sprintf("%s.%s",
                                    question, response)) %>%
  group_by(Name) %>%
  summarise(incorrect_string = paste0(incorrect_string, collapse = ", ")) %>%
  left_join(d, ., by = c("Name" = "Name"))

答案 1 :(得分:1)

这是一个解决方案,也许不优雅...... 使用d

answers= apply(d,1,FUN=function(row){paste(paste(as.character(1:(ncol(d)-1)),row[-1],sep=".")[row[-1]!=""],collapse=' ')})
out=data.frame(corrects=answers)
rownames(out) = d[,"Name"]
out


    corrects
Res1     1.A 4.D
Res2 2.B 3.C 4.D
Res3     1.A 3.E