我有这样的数据
df <- structure(list(A = structure(c(2L, 3L, 6L, 7L, 5L, 4L, 1L, 1L
), .Label = c("", "NZT1", "O749", "P42I;QJ0;AIH2", "P609;QT7",
"Q835", "Q854"), class = "factor"), B = structure(c(8L, 6L, 5L,
7L, 4L, 3L, 2L, 1L), .Label = c("", "P079;P0C7;P0C8", "P641;Q614",
"Q013", "Q554", "Q749", "Q955", "Q9U0"), class = "factor"), C = structure(c(7L,
8L, 6L, 5L, 3L, 4L, 1L, 2L), .Label = c("P641;QS14", "P679;P0C7;P048",
"Q168", "Q413", "Q550", "Q6N9", "Q980", "Q997"), class = "factor")), .Names = c("A",
"B", "C"), class = "data.frame", row.names = c(NA, -8L))
# A B C
#1 NZT1 Q9U0 Q980
#2 O749 Q749 Q997
#3 Q835 Q554 Q6N9
#4 Q854 Q955 Q550
#5 P609;QT7 Q013 Q168
#6 P42I;QJ0;AIH2 P641;Q614 Q413
#7 P079;P0C7;P0C8 P641;QS14
#8 P679;P0C7;P048
我试图基于&#34 ;;&#34;将它们拆分,然后将它们放在另一个字符串下,我寻求的预期输出就是这样
# A B C
#1 NZT1 Q9U0 Q980
#2 O749 Q749 Q997
#3 Q835 Q554 Q6N9
#4 Q854 Q955 Q550
#5 P609 Q013 Q168
#6 QT7 P641 Q413
#7 P42I Q614 P641
#8 QJ0 P079 QS14
#9 AIH2 P0C7 P679
#10 P0C8 P0C7
#11 P048
我尝试使用strsplit()
,但我没有那么远
这就是我试过的
myNewdf <- strsplit(as.character(unlist(df)), ";")
答案 0 :(得分:4)
scan
功能会在此处成功,但如果每列中的项目数不相同,as.data.frame
会阻塞:
as.data.frame(lapply( df, function(x) scan( text=as.character(x) , what="", sep=";", blank.lines.skip = FALSE))
+ )
Read 11 items
Read 11 items
Read 11 items
A B C
1 NZT1 Q9U0 Q980
2 O749 Q749 Q997
3 Q835 Q554 Q6N9
4 Q854 Q955 Q550
5 P609 Q013 Q168
6 QT7 P641 Q413
7 P42I Q614 P641
8 QJ0 P079 QS14
9 AIH2 P0C7 P679
10 P0C8 P0C7
11 P048
答案 1 :(得分:3)
我想你可以试试这个:
x <- lapply(df, function (x) unlist(strsplit(as.character(x), ";")))
这会给你一个清单。如果您需要数据框,则需要进一步填充空字符串""
:
m <- max(lengths(x))
y <- as.data.frame(lapply(x, function (vec) c(vec, character(m - length(vec)))))
# A B C
# 1 NZT1 Q9U0 Q980
# 2 O749 Q749 Q997
# 3 Q835 Q554 Q6N9
# 4 Q854 Q955 Q550
# 5 P609 Q013 Q168
# 6 QT7 P641 Q413
# 7 P42I Q614 P641
# 8 QJ0 P079 QS14
# 9 AIH2 P0C7 P679
# 10 P0C8 P0C7
# 11 P048
答案 2 :(得分:2)
或使用ts
功能:
lst <- lapply(df, function(a) unlist(strsplit(as.character(a), split = ";"))) # 1
tsr <- cbind(ts(lst$A), ts(lst$B), ts(lst$C)) # 2
tsr[is.na(tsr)] <- "" # 3
newDF <- as.data.frame(tsr) # 4
colnames(newDF) <- colnames(df) # 5 (if needed)
# A B C
# 1 NZT1 Q9U0 Q980
# 2 O749 Q749 Q997
# 3 Q835 Q554 Q6N9
# 4 Q854 Q955 Q550
# 5 P609 Q013 Q168
# 6 QT7 P641 Q413
# 7 P42I Q614 P641
# 8 QJ0 P079 QS14
# 9 AIH2 P0C7 P679
# 10 P0C8 P0C7
# 11 P048
lst
会列出;
个分隔列tsr
是时间序列对象的逐列绑定。时间序列对象用于处理不等长度。NA
中找到tsr
并使其无价值。newDF
的列名与df
相同。答案 3 :(得分:2)
以下是stri_list2matrix
的另一个选项。这将返回一个matrix
,其中NA为缺失值。如果我们需要''
,请使用fill=''
中的stri_list2matrix
参数。此外,可以使用data.frame
将其转换为as.data.frame
。
library(stringi)
stri_list2matrix(lapply(df, function(x) unlist(strsplit(as.character(x), ";"))))