小编Mah*_*oud的帖子

基于多列对Data.Table进行排序

考虑下面的数据表:

DT <- data.table(a=c(1,2,4,3,5), b=c(3:5,NA,2), c=c(2,1,NA,NA,3)) 
DT
   a  b  c
1: 1  3  2
2: 2  4  1
3: 4  5 NA
4: 3 NA NA
5: 5  2  3
Run Code Online (Sandbox Code Playgroud)

我想根据第 3 列和第 1 列对行进行排序。我可以使用:

DT[order(DT[,3],DT[,1])]

   a  b  c
1: 2  4  1
2: 1  3  2
3: 5  2  3
4: 3 NA NA
5: 4  5 NA
Run Code Online (Sandbox Code Playgroud)

但是,如果 DT 有很多列并且假设我想根据第 1 到第 i 列对它们进行排序,那么将其写为:

DT[order(DT[,1], DT[,2], DT[,3], ... DT[,i])]
Run Code Online (Sandbox Code Playgroud)

相反,我想提供列索引作为向量(见下文):

DT[order(DT[,c(1:i)])]
Run Code Online (Sandbox Code Playgroud)

但是,它不像我期望的那样工作,输出是:

DT[order(DT[,c(3,1)])]

     a  b  c
 1:  2 …
Run Code Online (Sandbox Code Playgroud)

sorting r data.table

5
推荐指数
1
解决办法
1345
查看次数

为每列多个数据表分配唯一ID

我想为每个多列值为数据表的行分配唯一的ID.让我们考虑一个简单的例子:

library(data.table)       
DT = data.table(a=c(4,2,NA,2,NA), b=c("a","b","c","b","c"), c=1:5)

    a b c
1:  4 a 1
2:  2 b 2
3: NA c 3
4:  2 b 4
5: NA c 5
Run Code Online (Sandbox Code Playgroud)

我想基于列a和b生成ID,并期望获得三个ID,其中第二和第四行ID相同,第三行和第五行也具有相同的ID.

我看过两个解决方案,但每个都略有不完整:

1)解决方案一需要排序数据表,如果我们需要为每个列生成ID(在我的实际应用中,ID是基于大约十列生成的),这非常麻烦.我们可以替换cumsum功能,因此不需要排序吗?

DT$ID1 <- cumsum(!duplicated(DT[,1:2]))
Run Code Online (Sandbox Code Playgroud)

2)解决方案二忽略NA值; 虽然我想包括NA并为他们分配一个组ID

DT <- transform(DT, ID2 = as.numeric(interaction(a,b, drop=TRUE)))
Run Code Online (Sandbox Code Playgroud)

我感谢有关如何修改任一解决方案以生成如下所示的Expected_ID的任何建议.

    a b c ID1 ID2 Expected_ID
1:  4 a 1   1   1           1
2:  2 b 2   2   2           2
3: NA c 3   3  NA           3
4:  2 b 4   3   2           2 …
Run Code Online (Sandbox Code Playgroud)

group-by r data.table

4
推荐指数
1
解决办法
846
查看次数

将字符串中第N个出现的字符替换为其他内容

考虑a = paste(1:10,collapse=", ")哪些结果

a = "1, 2, 3, 4, 5, 6, 7, 8, 9, 10"
Run Code Online (Sandbox Code Playgroud)

我想替换第n个(例如第4个)出现的“,”,并用其他内容(例如“ \ n”)替换它。所需的输出将是:

"1, 2, 3, 4\n 5, 6, 7, 8\n 9, 10"
Run Code Online (Sandbox Code Playgroud)

我正在寻找使用gsub(或等效的东西)和某种形式的代码regular expression来实现此目标的代码。

regex r

4
推荐指数
1
解决办法
202
查看次数

grepl在两个向量上

我想grepl在两个向量上应用,以查看第一个向量的元素在第二个向量的相应元素中是否可用。例如

grepl(c("bc","23","a2"),c("abcd","1234","zzzz"))
Run Code Online (Sandbox Code Playgroud)

既然bc在里面abcd23在里面1234a2不是里面zzzz,我想得到TRUE TRUE FALSE。但是,我得到的却是:

[1]  TRUE FALSE FALSE
Warning message:
In grepl(c("bc", "23", "a2"), c("abcd", "1234", "zzzz")) :
argument 'pattern' has length > 1 and only the first element will be used 
Run Code Online (Sandbox Code Playgroud)

r grepl

4
推荐指数
2
解决办法
70
查看次数

标签 统计

r ×4

data.table ×2

grepl ×1

group-by ×1

regex ×1

sorting ×1