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