我正在尝试计算我的数据框中的几个新变量.以初始值为例:
说我有:
Dataset <- data.frame(time=rep(c(1990:1992),2),
geo=c(rep("AT",3),rep("DE",3)),var1=c(1:6), var2=c(7:12))
time geo var1 var2
1 1990 AT 1 7
2 1991 AT 2 8
3 1992 AT 3 9
4 1990 DE 4 10
5 1991 DE 5 11
6 1992 DE 6 12
Run Code Online (Sandbox Code Playgroud)
而且我要:
time geo var1 var2 var1_1990 var1_1991 var2_1990 var2_1991
1 1990 AT 1 7 1 2 7 8
2 1991 AT 2 8 1 2 7 8
3 1992 AT 3 9 1 2 7 8
4 1990 DE …Run Code Online (Sandbox Code Playgroud) 我想我在包中发现了一个错误或更确切地说缺少更新countrycode:
library(countrycode)
testData <- data.frame(country=c(rep("Germany",3),rep("Kosovo",3)))
testData$iso3 <- countrycode(testData$country, "country.name", "iso3c")
Run Code Online (Sandbox Code Playgroud)
这不仅是出于政治原因,而且因为国际货币基金组织或国际清算银行等国际组织确实将科索沃纳入其数据集,因此存在问题。Countrycode 将NA's在此处生成。
我如何处理这些信息?我认为iso3c应该是KSV。
编辑:我联系了包维护者,他回答说,在科索沃得到正式承认之前,他宁愿保持这种方式。
我想在data.table的前面排序两列(在我的情况下为id和time).说我有:
library(data.table)
Data <- as.data.table(iris)
Run Code Online (Sandbox Code Playgroud)
并说我希望列的顺序是:
example <- Data
setcolorder(example,c("Species","Petal.Length","Sepal.Length",
"Sepal.Width","Petal.Length","Petal.Width"))
Run Code Online (Sandbox Code Playgroud)
但我的实际数据表有更多的变量,所以我想将其作为:
setcolorder(Data, c("Species","Petal.Length",
...all other variables in their original order...))
Run Code Online (Sandbox Code Playgroud)
我玩过类似的东西:
setcolorder(Data,c("Species","Petal.Length",
names(Data)[!c("Species","Petal.Length")]))
Run Code Online (Sandbox Code Playgroud)
但我有一个问题是通过名称参考对字符向量名称(数据)进行子集化.另外,我确信我可以通过一些简洁的data.table函数来避免这种解决方法,不是吗?
我试图在不同因素的数据框中得到一些变量的均值.说我有:
time geo var1 var2 var3 var4
1 1990 AT 1 7 13 19
2 1991 AT 2 8 14 20
3 1992 AT 3 9 15 21
4 1990 DE 4 10 16 22
5 1991 DE 5 11 17 23
6 1992 DE 6 12 18 24
Run Code Online (Sandbox Code Playgroud)
而且我要:
time geo var1 var2 var3 var4 m_var2 m_var3
1 1990 AT 1 7 13 19 8 14
2 1991 AT 2 8 14 20 8 14
3 1992 AT 3 …Run Code Online (Sandbox Code Playgroud) 我有一个data.table有很多缺失值,我想要一个变量,它给我一个1作为每组中的第一个非missin值.
说我有这样的数据.表:
library(data.table)
DT <- data.table(iris)[,.(Petal.Width,Species)]
DT[c(1:10,15,45:50,51:70,101:134),Petal.Width:=NA]
Run Code Online (Sandbox Code Playgroud)
现在在开头,结尾和中间都有缺失.我试过两个版本,一个是:
DT[min(which(!is.na(Petal.Width))),first_available:=1,by=Species]
Run Code Online (Sandbox Code Playgroud)
但它只能找到全局最小值(在这种情况下,setosa得到正确的1),而不是组的最小值.我认为情况就是这样,因为data.tablei的第一个子集,然后按组排序,是否正确?因此它只适用于全局最小值which(!is.na(Petal.Width))为第一个非NA值的行.
j中测试的第二次尝试:
DT[,first_available:= ifelse(min(which(!is.na(Petal.Width))),1,0),by=Species]
Run Code Online (Sandbox Code Playgroud)
它只返回一列1.在这里,我没有很好的解释为什么它不起作用.
我的目标是:
DT[,first_available:=0]
DT[c(11,71,135),first_available:=1]
Run Code Online (Sandbox Code Playgroud)
但实际上我有数百个团体.任何帮助,将不胜感激!
编辑:这个问题确实接近但不是针对NA的,如果我理解正确的话,并没有解决这个问题.我试过了:
DT <- data.table(DT, key = c('Species'))
DT[unique(DT[,key(DT), with = FALSE]), mult = 'first']
Run Code Online (Sandbox Code Playgroud) 我想编写一个函数,在其中构建几个新列.我在处理和命名data.table函数内部的列时遇到了一些问题.说我有:
library(data.table)
DT <- as.data.table(iris)
Run Code Online (Sandbox Code Playgroud)
并说我有兴趣以相同的方式为不同的colums创建新的变量(比方说Sepal.Length,Sepal.Width和Petal.Length).我希望有一个函数可以在一个新的列中对物种的所有观察值求和,然后将每个观察值的比率乘以Petal.Width该总和.如果我指定列的名称,我有一个工作示例:
thisworks <- function(a){
DT[,named_column1:=sum(eval(a),na.rm=T),by=Species]
DT[,named_column2:=named_column1/Petal.Width]
DT
}
DT <- thisworks(DT[,Sepal.Length])
Run Code Online (Sandbox Code Playgroud)
但是,如果我想为其他变量执行此操作(Sepal.Width并且Petal.Length,总共产生6个新列),我想基于此确定列名.我的非工作尝试:
thisdoesntwork <- function(b){
name1 <- paste0("total_",names(b))
#here, I don't know how to get the name of the column
DT[,assign(name1,sum(eval(column_of_interest),na.rm=T)),by=Species]
name2 <- paste0("ratio_",names(b))
DT[,assign(name2,named_column1/Petal.Width)]
DT
}
for (i in c("Sepal.Length", "Sepal.Width", "Petal.Length"){
# I know I know, loops are evil. However, data.table is fast so i dont mind
DT <- …Run Code Online (Sandbox Code Playgroud) 我正在寻找这个的更新版本:https : //cran.r-project.org/web/packages/lfe/index.html package。它似乎已从 CRAN 中删除。我怎样才能了解这个过程的历史,以了解它是被迁移到新包还是不再维护?
我想基于手动指定的字符向量订购数据表。
library(data.table)
DT = data.table(x=c("c","b","a"), y=1:3)
Run Code Online (Sandbox Code Playgroud)
我可以按字母顺序排序:
DT[order(x)]
Run Code Online (Sandbox Code Playgroud)
但我可以根据像这样的字符向量来订购它吗:
preferred.order <- c("b","a","c")
Run Code Online (Sandbox Code Playgroud)
目标是:
data.table(x=c("b","a","c"), y=c(2,1,3))
Run Code Online (Sandbox Code Playgroud)
实际上,我在第一列中有一个data.table,其中包含收集的输出和变量名称。为了便于演示,我希望这些变量以特定的顺序(而不是字母顺序)排列。
我试图运行lapply以保存许多不同的数据集,这些数据集应以函数参数(字符串向量)命名。我认为我将问题缩小到以下可重现的示例:
test_x <- c(1:3)
name <- paste0("test_","x")
summary(name)
Run Code Online (Sandbox Code Playgroud)
x我的函数参数在哪里,因此我需要paste0()创建名称。
我怎样才能摆脱了""在name?我想让摘要理解name实际上是test_x。
这是我打算使用的不可复制代码,以防您认为错误可能在其他地方:
savesum <- function(x){
out<-capture.output(summary(eba_results[[x]])) #following Rolands comment, we don't even need get()
name <- paste0("eba_",x,".txt")
cat(out,file=name,sep="\n",append=TRUE)
}
lapply(indicators,savesum)
Run Code Online (Sandbox Code Playgroud)