如何在R数据帧中向重复项添加计数

如何在R数据帧中向重复项添加计数,r,loops,tiff,raster,rgdal,R,Loops,Tiff,Raster,Rgdal,我的R代码有困难。我正在尝试创建一个新的数据帧,基于我已经拥有的数据帧,其中每个重复值分别乘以1000,然后依次加1。例如,我的数据帧中的值范围从3869014到4524673,每个数字有多个值(最多100个)。例如:[3869014、3869014、3869014、3869014、3869014、3869014、3869014、3869015、3869015、3869015、3869015、3869016、3869016、3869016、3869016、3869016等]。我想要的是:[386

我的R代码有困难。我正在尝试创建一个新的数据帧,基于我已经拥有的数据帧,其中每个重复值分别乘以1000,然后依次加1。例如,我的数据帧中的值范围从3869014到4524673,每个数字有多个值(最多100个)。例如:[3869014、3869014、3869014、3869014、3869014、3869014、3869014、3869015、3869015、3869015、3869015、3869016、3869016、3869016、3869016、3869016等]。我想要的是:[3869014001、3869014002、3869014003、3869014004、3869014005、3869014006、3869014007、3869014008、3869015001、3869015002、3869015003、3869015004、3869016001、3869016002、3869016003、3869016004,等等]

我尝试了下面的代码,但它将每个数字乘以1000,并添加一个,而不考虑重复。它也只添加一个,而不是添加计数(例如:1、2、3、4等)。所以输出是[3869014001,3869014001,3869014001,3869014001,3869014001,等等…这不是我想要的。我对R数据帧中的循环有些陌生。谢谢你的帮助

setwd("F:/TimData/SPAM/Ethiopia")
#clear all variables
rm(list=ls())

#install packages
install.packages(c("spatstat","maptools","lattice","sp","RColorBrewer","splancs","maps", "plyr"))
install.packages(c("rgdal","raster","R.utils","spsurvey", "xlsx", "rJava", "foreign"),dep=TRUE)

#load libraries
library(spatstat); library(maptools); library(lattice); library(sp); 
library(RColorBrewer); library(splancs); library(maps)
library(rgdal); library(raster); library(R.utils); library(spsurvey); library(foreign);
library(rJava)
library(xlsx)
library(plyr)

#creating a custom 1km spatial grid

kmgrid = readGDAL("EthiopiaBuffer1km.tif")

#convert raster to data frame
kmgridx= as.data.frame(kmgrid, row.names=NULL, optional=FALSE, xy=FALSE, na.rm=TRUE)

#specify column containing raster values
x=kmgridx$band1

#setting counter for while statement, based on actual min/max values of raster #grid
start = 3869014
finish = 4525673

#setting loop to multiply each duplicate by 1000 and add one, doesn't work

while (start < finish) {
    if (start) {
        for (i in 1:length(x)) {y=(x*1000)+1} 
        start=start +1 }
    }
setwd(“F:/TimData/SPAM/埃塞俄比亚”)
#清除所有变量
rm(list=ls())
#安装软件包
安装软件包(c(“spatstat”、“maptools”、“lattice”、“sp”、“RColorBrewer”、“splancs”、“maps”、“plyr”))
安装包(c(“rgdal”、“光栅”、“R.utils”、“spsurvey”、“xlsx”、“rJava”、“foreign”),dep=TRUE)
#加载库
库(spatstat);库(maptools);库(lattice);库(sp);
图书馆(RColorBrewer);图书馆(splancs);图书馆(地图)
图书馆(rgdal);图书馆(光栅);图书馆(R.utils);图书馆(SPSSurvey);图书馆(外国);
图书馆(rJava)
图书馆(xlsx)
图书馆(plyr)
#创建自定义1km空间栅格
kmgrid=readGDAL(“EthiopiaBuffer1km.tif”)
#将光栅转换为数据帧
kmgridx=as.data.frame(kmgrid,row.names=NULL,optional=FALSE,xy=FALSE,na.rm=TRUE)
#指定包含光栅值的列
x=kmgridx$band1
#根据光栅网格的实际最小/最大值设置while语句的计数器
开始=3869014
光洁度=4525673
#将循环设置为将每个副本乘以1000,然后再加上一个,这样做不起作用
while(开始<结束){
如果(启动){
对于(1中的i:length(x)){y=(x*1000)+1}
开始=开始+1}
}

这可能就是您要找的

id<-c(rep(1,5),rep(2,5),rep(3,5))
y<-rnorm(15)
df<-data.frame(id=id,y=y)
seq_along_mult<-function(x){ 

    y<-x*1000+seq_along(x) #creating your new id variable
    return(y)
}

df$number <- with(df, ave(id, id, FUN=seq_along_mult))

    id         y  number
1   1  0.1872768   1001
2   1  1.9137194   1002
3   1 -0.6226594   1003
4   1 -1.0641839   1004
5   1 -0.3422707   1005
6   2 -0.1013222   2001
7   2  0.5783932   2002
8   2  0.8276480   2003
9   2  1.3111752   2004
10  2  0.1783597   2005
11  3  1.7036697   3001
12  3 -0.5759164   3002
13  3 -0.7028795   3003
14  3 -0.2590082   3004
15  3  1.9239665   3005

id这是一个带有tapply的版本

a <- c(3869014, 3869014, 3869014, 3869014, 3869014, 3869014, 3869014, 3869014, 3869015, 3869015, 3869015, 3869015, 3869016, 3869016, 3869016, 3869016)
a <- as.character(a)
aa <- unname(unlist(tapply(a, a, function(x)paste0(x, 1000+(1:length(x))))))
> aa
[1] "38690141001" "38690141002" "38690141003" "38690141004" "38690141005" "38690141006"
[7] "38690141007" "38690141008" "38690151001" "38690151002" "38690151003" "38690151004"
[13] "38690161001" "38690161002" "38690161003" "38690161004"

a使用
dplyr

library(dplyr)
set.seed(1)
df <- data.frame(id = c(rep(1,5), rep(2,5), rep(3,5)), y = rnorm(15))

df %>% group_by(id) %>% mutate(number = (id * 1000) + 1:n())

你确定你的例子符合你的问题描述吗?为什么你要安装一个似乎与问题无关的加载一百万个软件包?尽量减少这个例子。作为一个提示:你可能想看看基本R中的
?ave
seq\u。这将创建一个字符向量。不确定这是否是他们想要的(ed)这很容易用as.numeric()修复。你有更好的建议吗?tapply的用法很好!我想修复它的一小部分。它应该添加“001”“002”
aa,而不是添加“1001”“1002”
#Source: local data frame [15 x 3]
#Groups: id
#
#   id          y number
#1   1 -0.6264538   1001
#2   1  0.1836433   1002
#3   1 -0.8356286   1003
#4   1  1.5952808   1004
#5   1  0.3295078   1005
#6   2 -0.8204684   2001
#7   2  0.4874291   2002
#8   2  0.7383247   2003
#9   2  0.5757814   2004
#10  2 -0.3053884   2005
#11  3  1.5117812   3001
#12  3  0.3898432   3002
#13  3 -0.6212406   3003
#14  3 -2.2146999   3004
#15  3  1.1249309   3005