R 将二分法列连接到分号分隔列
我有一个包含多项选择题结果的数据框。每个项目有0(未提及)或1(提及)。列的名称如下所示:R 将二分法列连接到分号分隔列,r,string,data.table,R,String,Data.table,我有一个包含多项选择题结果的数据框。每个项目有0(未提及)或1(提及)。列的名称如下所示: F1.2_1、F1.2_2、F1.2_3、F1.2_4、F1.2_5、F1.2_99 等等 我想这样连接这些值:新列应该是一个以分号分隔的选定项字符串。因此,如果一行在F1.2_1、F1.2_4和F1.2_5中有一个1,那么它应该是:1;4.5 二分法列的最后一位是字符串中要使用的项目代码 你知道如何用R(和data.table)实现这一点吗?谢谢你的帮助 编辑: 下面是一个具有所需结果的示例DF: st
F1.2_1、F1.2_2、F1.2_3、F1.2_4、F1.2_5、F1.2_99
等等
我想这样连接这些值:新列应该是一个以分号分隔的选定项字符串。因此,如果一行在F1.2_1、F1.2_4和F1.2_5中有一个1,那么它应该是:1;4.5
二分法列的最后一位是字符串中要使用的项目代码
你知道如何用R(和data.table)实现这一点吗?谢谢你的帮助
编辑:
下面是一个具有所需结果的示例DF:
structure(list(F1.2_1 = c(0L, 1L, 0L, 1L), F1.2_2 = c(1L, 0L,
0L, 1L), F1.2_3 = c(0L, 1L, 0L, 1L), F1.2_4 = c(0L, 1L, 0L, 0L
), F1.2_5 = c(0L, 0L, 0L, 0L), F1.2_99 = c(0L, 0L, 1L, 0L), desired_result = structure(c(3L,
2L, 4L, 1L), .Label = c("1;2;3", "1;3;4", "2", "99"), class = "factor")), .Names = c("F1.2_1",
"F1.2_2", "F1.2_3", "F1.2_4", "F1.2_5", "F1.2_99", "desired_result"
), class = "data.frame", row.names = c(NA, -4L))
F1.2_1 F1.2_2 F1.2_3 F1.2_4 F1.2_5 F1.2_99 desired_result
1 0 1 0 0 0 0 2
2 1 0 1 1 0 0 1;3;4
3 0 0 0 0 0 1 99
4 1 1 1 0 0 0 1;2;3
我们可以试试
j1 <- do.call(paste, c(as.integer(sub(".*_", "",
names(DF)[-7]))[col(DF[-7])]*DF[-7], sep=";"))
DF$newCol <- gsub("^;+|;+$", "", gsub(";*0;|0$|^0", ";", j1))
DF$newCol
#[1] "2" "1;3;4" "99" "1;2;3"
j1我们可以试试
j1 <- do.call(paste, c(as.integer(sub(".*_", "",
names(DF)[-7]))[col(DF[-7])]*DF[-7], sep=";"))
DF$newCol <- gsub("^;+|;+$", "", gsub(";*0;|0$|^0", ";", j1))
DF$newCol
#[1] "2" "1;3;4" "99" "1;2;3"
j1在his中,OP询问如何处理更多的选择题
下面的方法将能够处理任意数量的问题和每个问题的选择。它使用data.table
包中的melt()和dcast()
样本输入数据
假设扩展案例的输入data.frameDT
包含两个问题,一个有6个选项,另一个有4个选项:
DT
# F1.2_1 F1.2_2 F1.2_3 F1.2_4 F1.2_5 F1.2_99 F2.7_1 F2.7_2 F2.7_3 F2.7_11
#1: 0 1 0 0 0 0 0 1 1 0
#2: 1 0 1 1 0 0 1 1 1 1
#3: 0 0 0 0 0 1 1 0 1 0
#4: 1 1 1 0 0 0 1 0 1 1
代码
库(data.table)
#强制到data.table并添加行号以供以后加入
setDT(DT)[,rn:=.I]
#从宽格式重塑为长格式
在他的报告中,OP询问了如何处理更多的选择题
下面的方法将能够处理任意数量的问题和每个问题的选择。它使用data.table
包中的melt()和dcast()
样本输入数据
假设扩展案例的输入data.frameDT
包含两个问题,一个有6个选项,另一个有4个选项:
DT
# F1.2_1 F1.2_2 F1.2_3 F1.2_4 F1.2_5 F1.2_99 F2.7_1 F2.7_2 F2.7_3 F2.7_11
#1: 0 1 0 0 0 0 0 1 1 0
#2: 1 0 1 1 0 0 1 1 1 1
#3: 0 0 0 0 0 1 1 0 1 0
#4: 1 1 1 0 0 0 1 0 1 1
代码
库(data.table)
#强制到data.table并添加行号以供以后加入
setDT(DT)[,rn:=.I]
#从宽格式重塑为长格式
非常感谢,这个小例子效果很好——然而,在我的真实数据中,有更多的专栏和不同的选择题。例如,另一个是F2.7_1
,F2.7_2
,F2.7_3
,F2.7_4
。。。还有一些只是其他问题。你知道如何将其合并吗?@Mario在我的第一种方法中,我使用了列编号,但当你显示需要的是列名称的最后一部分时,我更改了它。不确定您希望如何将其合并到数据中。表
:newCol=ifelse(F1.2_1==1,1,ifelse(F1.2_2,2,ifelse)(F1.2_3,3,ifelse(F1.2_4,4,ifelse)(F1.2_5,5,ifelse)(F1.2_6,6,ifelse)(F1.2_7,7,ifelse)(F1.2_8,8,ifelse)(F1.2_9,ifelse(99,2))是硬编码的,但是这个代码只生成一个字符而不是一个字符-分开。这东西能粘在一起吗rowwise@Mario这将是低效的。我提供的选项将非常快速,非常感谢,这在小示例中效果很好-但是,在我的实际数据中,有更多的列和不同的多项选择题。例如,另一个是F2.7_1
,F2.7_2
,F2.7_3
,F2.7_4
。。。还有一些只是其他问题。你知道如何将其合并吗?@Mario在我的第一种方法中,我使用了列编号,但当你显示需要的是列名称的最后一部分时,我更改了它。不确定您希望如何将其合并到数据中。表
:newCol=ifelse(F1.2_1==1,1,ifelse(F1.2_2,2,ifelse)(F1.2_3,3,ifelse(F1.2_4,4,ifelse)(F1.2_5,5,ifelse)(F1.2_6,6,ifelse)(F1.2_7,7,ifelse)(F1.2_8,8,ifelse)(F1.2_9,ifelse(99,2))是硬编码的,但是这个代码只生成一个字符而不是一个字符-分开。这东西能粘在一起吗rowwise@Mario这将是低效的。我提供的选项将非常快