如何按行显示缺失变量的名称?
How to show names of missing variables rowwise?
我确实有一个问题,我一个人无法解决。对不起,我是新手,我已经尝试了很多不同的东西。
我确实有一个包含 23 个参与者和 40 个变量的数据框。我想生成一个新的文本文件,说明每个参与者缺少哪些变量。我所做的是:
miss_val=vector(mode='list',length=num_participants)
for ( i in 1:num_participants){
miss_val[i]=sum(is.na(data[i,]))
}
这给了我每个参与者缺失值的总和。现在我想为每个参与者写一个句子,指定缺少哪些变量。我使用了 which(is.na(data[i,])
,它只给出了不同缺失值的位置——我怎样才能得到名字?我也试过:colnames( which( is.na (data[i,])
也不行。
没有提供数据,但您可以试试这个:
apply(dat, 1, function(x) { list(names(x)[ is.na(x) ] } )
结果将不是数据框,而是一个列表,其第 n 个条目的字符值是按行缺失元素的列名。
> dat <- data.frame( x=c(NA, 1:4),y=c("a",NA,"b","c","d"), z=c( NA, 1:3,NA))
> apply(dat, 1, function(x) { list(names(x)[ is.na(x) ]) } )[[1]]
[[1]]
[1] "x" "z"
> apply(dat, 1, function(x) { list(names(x)[ is.na(x) ]) } )
[[1]]
[[1]][[1]]
[1] "x" "z"
[[2]]
[[2]][[1]]
[1] "y"
[[3]]
[[3]][[1]]
character(0)
[[4]]
[[4]][[1]]
character(0)
[[5]]
[[5]][[1]]
[1] "z"
我想人们可能还会考虑列名上的 sapply
或 lapply
,然后可能会用 do.call
编辑 cbind()
。这是我想出的:
do.call(cbind, lapply(names(dat) , function (x) c(NA,x)[ 1+is.na(dat[[x]]) ] ))
[,1] [,2] [,3]
[1,] "x" NA "z"
[2,] NA "y" NA
[3,] NA NA NA
[4,] NA NA NA
[5,] NA NA "z"
需要将 is.na 按列应用的结果加 1 以创建索引以选择列名或 NA。
如果不能很好地了解您的数据,就很难进行评估。但是,您可以尝试 sapply() 函数。此函数可以循环遍历数据框中的变量和 return 列表对象,这在存储内容方面非常灵活。这是一个可能适合您的场景的示例:
# construct silly data.frame
temp <- data.frame("a"=1:10, "aa"=rep(1:5, 2), "b"=rnorm(10),
"c"=sample(c("good", "bad", "ugly"), 10, replace=TRUE))
# build in some missing values
temp$a[c(1,5)] <- NA
temp$b[c(3,7, 9)] <- NA
temp$c[c(2,5)] <- NA
# take a peek at the data
temp
# construct empty list to store names of missing vars
missingVars <- list()
# loop through observations
for(i in 1:nrow(temp)) {
# subset to one row data set
obs.row <- temp[i,]
# fill in missing var list with names of variables that are missing
missingVars[[paste0("obs.",i)]] <-
names(obs.row)[unlist(sapply(obs.row, is.na))]
}
根据您的描述,这应该可行。然后,您可以使用行号提取缺失变量的名称:
missingVars[[1]]
或使用列表元素的名称:
missingVars[["obs.1"]]
都会为第一次观察提取缺失变量的名称。
假设数据如下:
particpant var1 var2
1 1 0.74261292 0.2699047
2 2 0.08523502 -0.2588741
3 3 NA 1.3995776
4 4 0.12567631 0.8855174
5 5 0.44244614 -0.3241024
我是当前参与者以检查缺少的变量:
i <- 3
您可以通过以下方式使用 colnames 来获取 NA 列的名称。注意 colnames 的用法。参数是整个数据集,然后我们用which函数的return值索引到向量中:
colnames(data)[which(is.na(data[i,]))]
这将输出:
[1] "var1"
我确实有一个问题,我一个人无法解决。对不起,我是新手,我已经尝试了很多不同的东西。 我确实有一个包含 23 个参与者和 40 个变量的数据框。我想生成一个新的文本文件,说明每个参与者缺少哪些变量。我所做的是:
miss_val=vector(mode='list',length=num_participants)
for ( i in 1:num_participants){
miss_val[i]=sum(is.na(data[i,]))
}
这给了我每个参与者缺失值的总和。现在我想为每个参与者写一个句子,指定缺少哪些变量。我使用了 which(is.na(data[i,])
,它只给出了不同缺失值的位置——我怎样才能得到名字?我也试过:colnames( which( is.na (data[i,])
也不行。
没有提供数据,但您可以试试这个:
apply(dat, 1, function(x) { list(names(x)[ is.na(x) ] } )
结果将不是数据框,而是一个列表,其第 n 个条目的字符值是按行缺失元素的列名。
> dat <- data.frame( x=c(NA, 1:4),y=c("a",NA,"b","c","d"), z=c( NA, 1:3,NA))
> apply(dat, 1, function(x) { list(names(x)[ is.na(x) ]) } )[[1]]
[[1]]
[1] "x" "z"
> apply(dat, 1, function(x) { list(names(x)[ is.na(x) ]) } )
[[1]]
[[1]][[1]]
[1] "x" "z"
[[2]]
[[2]][[1]]
[1] "y"
[[3]]
[[3]][[1]]
character(0)
[[4]]
[[4]][[1]]
character(0)
[[5]]
[[5]][[1]]
[1] "z"
我想人们可能还会考虑列名上的 sapply
或 lapply
,然后可能会用 do.call
编辑 cbind()
。这是我想出的:
do.call(cbind, lapply(names(dat) , function (x) c(NA,x)[ 1+is.na(dat[[x]]) ] ))
[,1] [,2] [,3]
[1,] "x" NA "z"
[2,] NA "y" NA
[3,] NA NA NA
[4,] NA NA NA
[5,] NA NA "z"
需要将 is.na 按列应用的结果加 1 以创建索引以选择列名或 NA。
如果不能很好地了解您的数据,就很难进行评估。但是,您可以尝试 sapply() 函数。此函数可以循环遍历数据框中的变量和 return 列表对象,这在存储内容方面非常灵活。这是一个可能适合您的场景的示例:
# construct silly data.frame
temp <- data.frame("a"=1:10, "aa"=rep(1:5, 2), "b"=rnorm(10),
"c"=sample(c("good", "bad", "ugly"), 10, replace=TRUE))
# build in some missing values
temp$a[c(1,5)] <- NA
temp$b[c(3,7, 9)] <- NA
temp$c[c(2,5)] <- NA
# take a peek at the data
temp
# construct empty list to store names of missing vars
missingVars <- list()
# loop through observations
for(i in 1:nrow(temp)) {
# subset to one row data set
obs.row <- temp[i,]
# fill in missing var list with names of variables that are missing
missingVars[[paste0("obs.",i)]] <-
names(obs.row)[unlist(sapply(obs.row, is.na))]
}
根据您的描述,这应该可行。然后,您可以使用行号提取缺失变量的名称:
missingVars[[1]]
或使用列表元素的名称:
missingVars[["obs.1"]]
都会为第一次观察提取缺失变量的名称。
假设数据如下:
particpant var1 var2
1 1 0.74261292 0.2699047
2 2 0.08523502 -0.2588741
3 3 NA 1.3995776
4 4 0.12567631 0.8855174
5 5 0.44244614 -0.3241024
我是当前参与者以检查缺少的变量:
i <- 3
您可以通过以下方式使用 colnames 来获取 NA 列的名称。注意 colnames 的用法。参数是整个数据集,然后我们用which函数的return值索引到向量中:
colnames(data)[which(is.na(data[i,]))]
这将输出:
[1] "var1"