R 在另一个矩阵中查找对应于相同位置的值

R 在另一个矩阵中查找对应于相同位置的值,r,R,我试图得到每个人的因子分数。因子存储在数据框Factors中,我需要获得另一个名为data的数据框中对应于Factors的值的平均值,并将其存储在data中的新列中。我为这个糟糕的解释道歉。我希望我的例子会有所帮助,我很乐意回答问题 factors<-data.frame(c(NA,2,NA),c(NA,3,1)) colnames(factors)<-c("v1","v2") row.names(factors)<-c("col1data","col2data","col3d

我试图得到每个人的因子分数。因子存储在数据框
Factors
中,我需要获得另一个名为
data
的数据框中对应于
Factors
的值的平均值,并将其存储在
data
中的新列中。我为这个糟糕的解释道歉。我希望我的例子会有所帮助,我很乐意回答问题

factors<-data.frame(c(NA,2,NA),c(NA,3,1))
colnames(factors)<-c("v1","v2")
row.names(factors)<-c("col1data","col2data","col3data")
factors

data<-data.frame(c(2,4,2),c(1,1,2),c(3,3,3))
colnames(data)<-c("col1data","col2data","col3data")
row.names(data)<-c("person1","person2","person3")
data
#in dataframe factors row col2data is present (i.e. not NA) under factor V1
#go into dataframe data for each person and make a new column called v1 that holds the value of col2data
#do this for factor v2 and average the values to come up with one number for each person. Final result
data<-data.frame(c(2,4,2),c(1,1,2),c(3,3,3),c(1,1,2),c(2,3,2.5))
colnames(data)<-c("col1data","col2data","col3data","v1","v2(avg col2 and col3)")
row.names(data)<-c("person1","person2","person3")
data

factors您可以将
数据的行平均值
限制在适当的列中:

cbind(data, apply(factors, 2, function(x) rowMeans(data[,!is.na(x),drop=FALSE])))
#         col1data col2data col3data v1  v2
# person1        2        1        3  1 2.0
# person2        4        1        3  1 2.0
# person3        2        2        3  2 2.5

我将您注意到如何理解流程的方式放在代码中的注释中,以查看流程中每个步骤的执行位置

factors<-data.frame(c(NA,2,NA),c(NA,3,1))
colnames(factors)<-c("v1","v2")
row.names(factors)<-c("col1data","col2data","col3data")
factors

data<-data.frame(c(2,4,2),c(1,1,2),c(3,3,3))
colnames(data)<-c("col1data","col2data","col3data")
row.names(data)<-c("person1","person2","person3")
data

#find row names in a column of dataframe factors that are not NA
not_na_rows_v1 <- rownames(factors)[!is.na(factors$v1)]
not_na_rows_v2 <- rownames(factors)[!is.na(factors$v2)]
not_na_rows_v1
not_na_rows_v2
#match row names to dataframe data columns.
#Sum matching row names in data and store in new variable called the column name of the column in data (eg v1) for each person
###*note*### apply(...,1 ,mean) takes the mean for each row (the "1" means by row, "2" would mean by column)
data[, 'v1'] <- data[, not_na_rows_v1]
data[, 'v2'] <- apply(data[, not_na_rows_v2], 1, mean)
data

factors
lappy
可能更合适,您还可以通过将索引作为列表而不是列来摆脱
drop=FALSE
cbind(data,lappy(factors,function(x)rowMeans(data[!is.na(x)])