替换向量中行和列的dataframe中的值

替换向量中行和列的dataframe中的值,r,dataframe,vector,R,Dataframe,Vector,我有一个带零的数据帧: 2015 2016 2017 2018 1 0 0 0 0 2 0 0 0 0 3 0 0 0 0 4 0 0 0 0 我还有两个向量:1,3,3,3(行号)和2015、2016、2016、2018(列名)。我想增加这些特定行号和列名的(+1)值([12015]、[32016]、[32016]、[32018]),以获得如下结果: 2015 2016

我有一个带零的数据帧:

    2015 2016 2017 2018
1     0    0    0    0 
2     0    0    0    0
3     0    0    0    0
4     0    0    0    0
我还有两个向量:
1,3,3,3
(行号)和
2015、2016、2016、2018
(列名)。我想增加这些特定行号和列名的(+1)值([12015]、[32016]、[32016]、[32018]),以获得如下结果:

    2015 2016 2017 2018
1     1    0    0    0 
2     0    0    0    0
3     0    2    0    1
4     0    0    0    0
您需要将列名向量作为字符传递,否则它将解释为第2015列,这就是为什么
paste()

虚拟数据:

df = data.frame(rep(0,4),rep(0,4),rep(0,4),rep(0,4))
colnames(df) = 2015:2018

vec1 = c(1,3,3,3)
vec2 = c(2015,2016,2016,2018)

你可以试试这样的暴力手段

#Create your data.frame
d=data.frame(matrix(0,ncol=4,nrow=4))
dimnames(d)=list( 1:4,2015:2018)

#Create your two vectors, note that the column names are characters
r=c(1,3,3,3)
cl=as.character(c(2015,2016,2016,2018))

#Loop through the vectors, locate each position in the data.frame and increment by 1
for(i in 1:length(r)){
  d[r[i],cl[i]] = d[r[i],cl[i]]+1
}

d

`这里有一个矢量化选项

m1 <- cbind(vec1, match(vec2, names(df)))
v1 <- ave(rep(1, length(vec1)), m1[,1], m1[,2], FUN = sum)
i1 <- !duplicated(m1)
df[m1[i1,]] <- v1[i1]
数据
df
m1 <- cbind(vec1, match(vec2, names(df)))
v1 <- ave(rep(1, length(vec1)), m1[,1], m1[,2], FUN = sum)
i1 <- !duplicated(m1)
df[m1[i1,]] <- v1[i1]
df
#  2015 2016 2017 2018
#1    1    0    0    0
#2    0    0    0    0
#3    0    2    0    1
#4    0    0    0    0
df <- data.frame(rep(0,4),rep(0,4),rep(0,4),rep(0,4))
colnames(df) <- 2015:2018

vec1 <- c(1,3,3,3)
vec2 <- c(2015,2016,2016,2018)