考虑下面的数据表:
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) 我想为每个多列值为数据表的行分配唯一的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) 考虑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来实现此目标的代码。
我想grepl在两个向量上应用,以查看第一个向量的元素在第二个向量的相应元素中是否可用。例如
grepl(c("bc","23","a2"),c("abcd","1234","zzzz"))
Run Code Online (Sandbox Code Playgroud)
既然bc在里面abcd,23在里面1234而a2不是里面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)