R 如何测试数据帧中缺少的行/值以帮助转置其中的一部分?

R 如何测试数据帧中缺少的行/值以帮助转置其中的一部分?,r,dataframe,missing-data,reshape2,R,Dataframe,Missing Data,Reshape2,我有一个数据框,包含重复采样的个体和存活天数的数据。有些个体并不是每天都进行取样。我想将数据从面向行(每一个人&活动日是一行)移动到面向列(一个人一行,每一列保存活动日的数据) 但是,当一个人在第一个DF中没有某一天的行时,我为此运行的代码会出现错误,因为在第二个DF中有该天的列。我还没有找到一个好方法来测试第一个DF中是否缺少行和值,它使值成为长度为0的数值(即,数值(0)),对这样一个变量执行逻辑测试不会提供逻辑答案(O或1),它只会产生逻辑答案(0) 下面是我尝试做的一个简单例子。我知道可

我有一个数据框,包含重复采样的个体和存活天数的数据。有些个体并不是每天都进行取样。我想将数据从面向行(每一个人&活动日是一行)移动到面向列(一个人一行,每一列保存活动日的数据)

但是,当一个人在第一个DF中没有某一天的行时,我为此运行的代码会出现错误,因为在第二个DF中有该天的列。我还没有找到一个好方法来测试第一个DF中是否缺少行和值,它使值成为长度为0的数值(即,数值(0)),对这样一个变量执行逻辑测试不会提供逻辑答案(O或1),它只会产生逻辑答案(0)

下面是我尝试做的一个简单例子。我知道可能有其他方法来处理我正在做的一些更大的数据移动,但如果可能的话,我希望这样做。当个人=B和dayAlive=2时,下面的代码将被卡住,因为该个人没有dayAlive=2。我希望能够测试是否没有这样的行,然后在第二个数据帧单元格中插入NA或其他内容,这些数据将被放入其中

# Initialize data in row format in first data fram:
v1<-c("A",1,1.3)
v2<-c("A",2,1.8)
v3<-c("A",3,2.4)
v4<-c("B",1,0.8)
v5<-c("B",3,1.7)
first_DF<-data.frame(matrix(c(v1,v2,v3,v4,v5),ncol=3, nrow=5,byrow=TRUE,dimnames=list(NULL,c("Individual","DayAlive","Length"))), stringsAsFactors=FALSE)

# Convert to column format in second data frame:
individual_IDs<-unique(first_DF$"Individual")
days_alive<-unique(first_DF$"DayAlive")

# Initialize second DF by subsetting a single row for each individual from the first DF
second_DF<-data.frame(first_DF[which(first_DF$"Individual" %in% individual_IDs & first_DF$"DayAlive" %in% 1),1], stringsAsFactors=FALSE)
names(second_DF)<-"Individual"
initial_DF_width<-dim(second_DF)[2]

# Move 'Length' data into the columns as each 'day alive' column is created:
for(i in 1:length(days_alive)){
  current_day<-days_alive[i]
  second_DF<-cbind(second_DF,matrix(ncol=1, nrow=nrow(second_DF),dimnames=list(NULL,paste("Day ",current_day," Length"))))

  for(j in 1:length(individual_IDs)){
    current_individualID<-individual_IDs[j]
    length<-first_DF[which(first_DF$"Individual" %in% current_individualID & first_DF$"DayAlive" %in% current_day),"Length"]
    second_DF[j,i+initial_DF_width]<-length
  }
}
#在第一个数据帧中以行格式初始化数据:

v1您应该查看
重塑2
包。试试这个:

library('reshape2')

dcast(first_DF, Individual ~ DayAlive)
#   Individual   1    2   3
# 1          A 1.3  1.8 2.4
# 2          B 0.8 <NA> 1.7
library('reformae2')
dcast(第一天,个人~daylave)
#个人12 3
#1 A 1.3 1.8 2.4
#2 B 0.81.7
既然你说如果可能的话你想按你的方式做,我也编辑了你的嵌套循环。然而,我不建议这样做。大多数人都会告诉你,R中的嵌套循环通常不是最好的主意,在这种情况下确实如此

for(i in 1:length(days_alive)){
  current_day<-days_alive[i]
  second_DF<-cbind(second_DF,matrix(ncol=1, nrow=nrow(second_DF),dimnames=list(NULL,paste("Day ",current_day," Length"))))

  for(j in 1:length(individual_IDs)){
    current_individualID<-individual_IDs[j]

    # I changed "length" to "length2" to avoid confusion with the 
    # function length(). You also don't need which() here.
    length2 <- first_DF[first_DF$Individual %in% current_individualID 
                        & first_DF$DayAlive %in% current_day, "Length"]
    if (length(length2) > 0) {
      second_DF[j, i + initial_DF_width] <- length2
    } else {
      second_DF[j, i + initial_DF_width] <- NA
    }
  }
}
for(1中的i:长度(存活天数)){

谢谢你,卡拉!这两个答案都很好,后一个(带循环)肯定能用,尽管我更喜欢使用整形2函数。但是,我的实际DF有点复杂,dcast还不能用。我想这只是因为一些列名有空格(例如,“Jar name”)dcast不喜欢在列名称前后加引号或不加引号。我还在阅读dcast文档,但如果你有建议,我会感兴趣。当然,我可以在不加空格的情况下重命名列,但我希望避免这种情况。带空格的列名称在语法上是无效的;我很惊讶你能在c中保留空格没有额外努力的列名称。你为什么要保留它们?啊,我不知道R不会这么喜欢空格。我想如果我一直使用引号,我可以保留它们。我只是不想花时间重写我的没有空格的列名称,但我现在正在这样做。无论如何,重塑2似乎非常强大,所以我期待着将其用于其他工作将来。谢谢!您可以通过执行以下操作轻松地将空格替换为句点:
names(first_DF)