Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/67.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_Text_Merge - Fatal编程技术网

R 如何在分号分隔符中的新列内部将少数列合并为分号分隔符内的单个列

R 如何在分号分隔符中的新列内部将少数列合并为分号分隔符内的单个列,r,text,merge,R,Text,Merge,我想合并几个列,并创建一个包含列表(或类似python中的字典)的列,列表用分号分隔。 基本上,我有这样一个数据框:(空的空格缺少值) 我想创建一个列属性,它将一列中的几列合并在分号分隔符内 输出文件(可以是文本文件)的外观: 我的目的是编写一个文本文件,其中列由制表符分隔符(“\t”)分隔,属性数据(最后一列)类似于由“;”分隔的列表 此处提供了有关所需输出的更多详细信息 如何在R中执行此操作?thx一个选项是使用apply函数并传递最后3列的行数据。apply的好处在于,行数据作为命名向量传

我想合并几个列,并创建一个包含列表(或类似python中的字典)的列,列表用分号分隔。
基本上,我有这样一个数据框:(空的空格缺少值)

我想创建一个列
属性
,它将一列中的几列合并在分号分隔符内

输出文件(可以是文本文件)的外观:

我的目的是编写一个文本文件,其中列由制表符分隔符(“\t”)分隔,属性数据(最后一列)类似于由“;”分隔的列表

此处提供了有关所需输出的更多详细信息


如何在R中执行此操作?thx

一个选项是使用
apply
函数并传递最后3列的行数据。
apply
的好处在于,行数据作为
命名向量
传递给函数,其中
名称
与列名称匹配

现在,必须首先使用
paste
name
与命名向量的
value
组合,然后使用
collapse=“;”
函数的参数
paste0
再次合并为一个字符串。解决办法如下:

cbind(df[1:4],Attribute = 
   apply(df[,5:7],1, function(x)paste0(paste(names(x[!is.na(x)]),x[!is.na(x)], sep = "="),
   collapse = ";")))
# ID Event.Category Start.Time  End.Time                             Attribute
# 1  1         Stroke   1/1/2011      <NA>
# 2  1       Admitted   1/6/2011      <NA> Account.No.=24287939;Doctor.s_ID=5487
# 3  1      Diagnosed  1/25/2011      <NA>
# 4  6      Diagnosed   1/1/2011      <NA>
# 5  6   Drug       A   1/2/2011 1/10/2011                           Dosage=high
# 6  6   Drug       B   1/7/2011 1/20/2011    Account.No.=35287930;Dosage=medium
# 7 10   Drug       A   1/3/2011  1/6/2011                            Dosage=low
# 8 10   Drug       B   1/9/2011 1/13/2011                           Dosage=high
# 9 10         Stroke   1/8/2011      <NA>
cbind(df[1:4],属性=
应用(df[,5:7],1,函数(x)粘贴0(粘贴(名称(x[!is.na(x)]),x[!is.na(x)],sep=“=”,
折叠(“;”))
#ID事件。类别开始。时间结束。时间属性
#1中风1/1/2011
#2.1 2011年1月6日承认的账户编号=24287939;医生s_ID=5487
#3.1 2011年1月25日诊断
#4.6诊断日期:2011年1月1日
#5.6药物A 2011年1月2日2011年1月10日剂量=高
#6 6药物B 2011年1月7日2011年1月20日账号=35287930;剂量=中等
#7 10药物A 2011年1月3日2011年1月6日剂量=低
#8 10药物B 2011年1月9日2011年1月13日剂量=高
#9 10中风2011年1月8日
数据:

df <- read.table(text =
'ID  "Event Category"  "Start Time"  "End Time"    "Account No."   Dosage  Doctor\'s_ID
1   Stroke          1/1/2011         NA          NA                NA       NA      
1   Admitted         1/6/2011        NA       24287939      NA            5487
1   Diagnosed        1/25/2011      NA          NA                NA       NA
6   Diagnosed        1/1/2011       NA          NA                NA       NA
6   "Drug       A"     1/2/2011   1/10/2011       NA           "high"         NA
6   "Drug       B"     1/7/2011   1/20/2011   35287930      "medium"         NA
10  "Drug       A"    1/3/2011    1/6/2011          NA         "low"         NA
10  "Drug       B"    1/9/2011    1/13/2011         NA         "high"         NA
10  Stroke          1/8/2011        NA          NA                NA       NA',
stringsAsFactors = FALSE, header = TRUE)

df您能给出数据帧的dput()吗?下面提供了数据。多亏了@MKRthanks,我还喜欢有一些条件,比如if(category==“B”),然后选择属性列的剂量列。我该怎么做?@Cina我想一个简单的
ifelse
就能帮到你。但如果你能修改你的问题并显示预期的结果,那么我就可以很容易地把它纳入我的答案中。
cbind(df[1:4],Attribute = 
   apply(df[,5:7],1, function(x)paste0(paste(names(x[!is.na(x)]),x[!is.na(x)], sep = "="),
   collapse = ";")))
# ID Event.Category Start.Time  End.Time                             Attribute
# 1  1         Stroke   1/1/2011      <NA>
# 2  1       Admitted   1/6/2011      <NA> Account.No.=24287939;Doctor.s_ID=5487
# 3  1      Diagnosed  1/25/2011      <NA>
# 4  6      Diagnosed   1/1/2011      <NA>
# 5  6   Drug       A   1/2/2011 1/10/2011                           Dosage=high
# 6  6   Drug       B   1/7/2011 1/20/2011    Account.No.=35287930;Dosage=medium
# 7 10   Drug       A   1/3/2011  1/6/2011                            Dosage=low
# 8 10   Drug       B   1/9/2011 1/13/2011                           Dosage=high
# 9 10         Stroke   1/8/2011      <NA>
df <- read.table(text =
'ID  "Event Category"  "Start Time"  "End Time"    "Account No."   Dosage  Doctor\'s_ID
1   Stroke          1/1/2011         NA          NA                NA       NA      
1   Admitted         1/6/2011        NA       24287939      NA            5487
1   Diagnosed        1/25/2011      NA          NA                NA       NA
6   Diagnosed        1/1/2011       NA          NA                NA       NA
6   "Drug       A"     1/2/2011   1/10/2011       NA           "high"         NA
6   "Drug       B"     1/7/2011   1/20/2011   35287930      "medium"         NA
10  "Drug       A"    1/3/2011    1/6/2011          NA         "low"         NA
10  "Drug       B"    1/9/2011    1/13/2011         NA         "high"         NA
10  Stroke          1/8/2011        NA          NA                NA       NA',
stringsAsFactors = FALSE, header = TRUE)