替换向量中行和列的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)