繁体   English   中英

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

[英]Finding value that corresponds to same location in another matrix

我试图获得每个人的因子得分。 因子存储在数据帧中factors我需要获取另一个数据帧中值的平均值,该数据帧称为与factors相对应的值的data ,并将其存储在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

我将尝试将其分为几个步骤(据我了解的过程):

  • 在不是NA的数据框factors列中查找行名
  • 将行名称与数据框data列匹配。
  • data匹配行名称的总和,并存储在每个人的data (例如v1 )中名为该列的列名称的新变量中

  • 您可以通过将data的行均值限制在适当的列中来进行此操作:

    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
    

    暂无
    暂无

    声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

     
    粤ICP备18138465号  © 2020-2024 STACKOOM.COM