首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何根据数据帧中的另一列在R中生成数字序列/秩?

如何根据数据帧中的另一列在R中生成数字序列/秩?
EN

Stack Overflow用户
提问于 2015-10-19 21:46:37
回答 2查看 255关注 0票数 1

因此,我有一个类似于以下所示的数据:

代码语言:javascript
复制
ID       TEXT  ReferenceTEXT  TextID  
 1        Yo        NA         NA
 2       Cool       Yup        5
 3       Nice       NA         NA
 4       Phat       Yup        5       
 5       Yup        Phat       4       
 6       Boss       NA         NA       
 7       Yay        Phat       4     

通过在match中使用dataframe$TextID <- match(dataframe$ReferenceText,dataframe$Text, incomparables=NA)

我为TextID提取了ReferenceText。现在,我想在一个名为TextID的新列下获得SequenceID的序列/等级,如下所示:

代码语言:javascript
复制
 ID       TEXT  ReferenceText  TextID  SequenceID
 1        Yo        NA         NA         NA
 2       Cool       Yup        5          5-1
 3       Nice       NA         NA         NA
 4       Phat       Yup        5          5-2
 5       Yup        Phat       4          4-1
 6       Boss       NA         NA         NA
 7       Yay        Phat       4          4-2

但我该怎么做呢?完成这项任务最实际的方法是什么?这种解决方案是需要一个数据框架的160,000+观测。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-10-19 22:01:01

base R

代码语言:javascript
复制
df$SequenceID <- paste(df$TextID, ave(df$TextID, df$TextID, FUN=seq_along), sep="-")
is.na(df$SequenceID) <- is.na(df$TextID)
df
#   ID TEXT ReferenceTEXT TextID SequenceID
# 1  1   Yo          <NA>     NA       <NA>
# 2  2 Cool           Yup      5        5-1
# 3  3 Nice          <NA>     NA       <NA>
# 4  4 Phat           Yup      5        5-2
# 5  5  Yup          Phat      4        4-1
# 6  6 Boss          <NA>     NA       <NA>
# 7  7  Yay          Phat      4        4-2

使用ave,创建类似id的序列并将其与id粘贴在一起。然后定义正确的NA值。

更新

为了获得更清晰的外观,您可以使用transform创建新列并将其赋值在一行中,并根据需要删除NA字符串:

代码语言:javascript
复制
newdf <- transform(df, SequenceID = paste(TextID, ave(TextID, TextID, FUN=seq_along), sep="-"))
is.na(newdf$SequenceID) <- is.na(df$TextID)
票数 3
EN

Stack Overflow用户

发布于 2015-10-19 22:00:07

尝尝这个

代码语言:javascript
复制
library(dplyr)
dataframe %>% 
  group_by(ReferenceTEXT) %>% 
  mutate(SequenceID = ifelse(is.na(TextID), NA_character_, paste(TextID, seq_len(n()), sep="-")))
# Source: local data frame [7 x 5]
# Groups: ReferenceTEXT [3]
# 
# ID   TEXT ReferenceTEXT TextID     SequenceID
# (int) (fctr)        (fctr)  (int) (chr)
# 1     1     Yo            NA     NA    NA
# 2     2   Cool           Yup      5   5-1
# 3     3   Nice            NA     NA    NA
# 4     4   Phat           Yup      5   5-2
# 5     5    Yup          Phat      4   4-1
# 6     6   Boss            NA     NA    NA
# 7     7    Yay          Phat      4   4-2
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33224478

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档