将字符串的出现分组到一行

时间:2016-12-20 07:47:02

标签: r plyr

TL;博士 有没有办法将大量值组合到一个列而不截断这些值?

我正在研究RStudio上有48,178个条目的数据框。数据框有2列,其中第一列包含唯一的数值,另一列包含重复的字符串。

----------
id    name
1     forest
2     forest
3     park
4     riverbank
.
.
.
.
.
48178   water
----------

我想根据第二列中的唯一条目将所有条目组合在一起。我使用了包“ddply”来实现结果。我现在有以下派生表:

----------
type         V1
forest       forest,forest,forest
park         park,park,park,park
riverbank    riverbank,riverbank,
water        water,water,water,water
----------

但是,在对派生数据框应用str函数时,我发现该列包含截断值,而不是每个字符串的每个实例。

str的输出是:

'data.frame':   4 obs. of  2 variables:
 $ type: chr  "forest" "park" "riverbank" "water"
 $ V1  : chr  "forest,forest,forest,forest,forest,forest,forest,forest,forest,forest,forest,forest,forest,forest,forest,forest,forest,forest,f"| __truncated__ "park,park,park,park,park,park,park,park,park,park,park,park,park,park,park,park,park,park,park,park,park,park,park,park,park,pa"| __truncated__ "riverbank,riverbank,riverbank,riverbank,riverbank,riverbank,riverbank,riverbank,riverbank,riverbank,riverbank,riverbank,riverba"| __truncated__ "water,water,water,water,water,water,water,water,water,water,water,water,water,water,water,water,water,water,water,water,water,w"| __truncated__`

如何将相同的字符串组合在一起并将它们连接到一行而不截断?

4 个答案:

答案 0 :(得分:1)

尝试使用base R split()函数将结果存储在列表中:

new.list <- split(df, f=df$type)

这会将数据帧拆分为多个数据帧,可以使用方括号进行访问。它使字符串不会被合并和截断,因为记录继续保存在不同的单元格中。

答案 1 :(得分:1)

您的字符串不会被截断,只有str的显示被截断:

size <- 48000
df <- data.frame(1:size, 
                 type=sample(c("forest", "park", "riverbank", "water" ), 
                             size, replace = TRUE), 
                 stringsAsFactors = FALSE)

res <- by(df$type , df$type, paste, collapse=",")


str(res)
 'by' chr [1:4(1d)] "forest,forest,forest,forest,forest,forest,forest,forest,forest,forest,forest,forest,forest,forest,forest,forest,forest,forest,f"| __truncated__ ...
 - attr(*, "dimnames")=List of 1
  ..$ df$type: chr [1:4] "forest" "park" "riverbank" "water"
 - attr(*, "call")= language by.default(data = df$type, INDICES = df$type, FUN = paste, collapse = ",")


lengths( strsplit(res, ','))
   forest      park riverbank     water 
    11993     12017     11953     12037 

sum(lengths( strsplit(res, ',')))
[1] 48000

答案 2 :(得分:1)

扩展 HubertL 的答案,str()函数完全符合预期,但对于您打算做的事情可能是错误的选择。

根据您在Q 中提供的(相当有限的)信息,您似乎已经实现了所需的信息,即连接相同类型的所有字符串。

但是,您似乎仍然坚持?str功能的输出。

请参阅帮助页summary

来自描述部分:

  

紧凑地显示R对象的内部结构,诊断功能以及dput(在某种程度上,str())的替代方案。理想情况下,每个“基本”结构只显示一行。它特别适合紧凑地显示(可能是嵌套的)列表的(缩写)内容。我们的想法是为任何R对象提供合理的输出。

nchar.max有一个参数nchar.max,默认为128。

  

character要为longch字符串显示的最大字符数。更长的字符串会被截断,请参阅下面的longch示例。

示例部分中的nchar(longch <- paste(rep(letters,100), collapse = "")) #[1] 2600 str(longch) # chr "abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvw"| __truncated__ str(longch, nchar.max = 52) # chr "abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxy"| __truncated__ 示例说明了此参数的效果:

?"Memory-limits"

字符串的最大长度

根据name字符串中的字节数限制为2 ^ 31 - 1~2 * 10 ^ 9 。给定数据框中的行数和select distinct office from Locations where office NOT IN ( select office from Locations where zip NOT IN (45220, 45221, 45214) ) and zip IN (45220, 45221, 45214) 的长度,连接的字符串不会超过0.6 * 10 ^ 6,这远远不是限制。

答案 3 :(得分:0)

如果您想要的只是一个计数,那么为什么不简单地使用table

df<- read.table(head=T, text="id    name
1     forest
2     forest
3     park
4     riverbank")
df
df1<- as.data.frame(table(df$name))
#will give you number of times the word occurs

# if for some reason you want a repetition,then 
x<- mapply(rep,df1$Var1,df1$Freq)
y<- sapply(x,paste,  collapse=",")
data.frame(type=df1$Var1, V1=y)