Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/75.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 将二分法列连接到分号分隔列_R_String_Data.table - Fatal编程技术网

R 将二分法列连接到分号分隔列

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

我有一个包含多项选择题结果的数据框。每个项目有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:

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.frame
DT
包含两个问题,一个有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.frame
DT
包含两个问题,一个有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这将是低效的。我提供的选项将非常快