我有这个df
:
A B C
1 NA 100 NA
2 130 NA NA
3 NA NA 200
4 110 NA NA
我要去bind
,去掉NA
,以便得到一列包含它们的值。
但是我需要保留信息的来源,所以我想用column_name
添加一个新列,这样它就会出来:
values column_name
1 130 A
2 110 A
3 100 B
4 200 C
有什么想法怎么做?
答案 0 :(得分:7)
这是{R {1}}在R底下的工作,
stack
给出,
s_df <- stack(df) s_df[complete.cases(s_df),]
编辑(如@snoram的评论所述)的上述一种统一格式
values ind
2 130 A
4 110 A
5 100 B
11 200 C
答案 1 :(得分:4)
使用tidyr和dplyr:
df1 %>%
gather(column, values) %>%
filter(!is.na(values))
column values
1 A 130
2 A 110
3 B 100
4 C 200
或在评论中提到@Kath:
df1 %>%
gather(column, values, na.rm = T)
数据:
df1 <- structure(list(A = c(NA, 130L, NA, 110L), B = c(100L, NA, NA,
NA), C = c(NA, NA, 200L, NA)), class = "data.frame", row.names = c("1",
"2", "3", "4"))
答案 2 :(得分:4)
使用基数R的一个选项是which
和arr.ind = TRUE
,在这里我们得到非NA值的索引,并得到其对应的列名。
indx <- which(!is.na(df), arr.ind = TRUE)
data.frame(values = df[indx], column = names(df)[indx[,2]])
# values column
#1 130 A
#2 110 A
#3 100 B
#4 200 C
或没有which
indx <- !is.na(df)
data.frame(values = df[indx], column = rep(names(df), colSums(indx)))
# values column
#1 130 A
#2 110 A
#3 100 B
#4 200 C
答案 3 :(得分:3)
使用T
的{{1}}版本以长格式放置数据并过滤缺失值:
data.table
其中dx是:
melt
您还可以使用library(data.table)
melt(setDT(dx))[!is.na(value)]
variable value
1: A 130
2: A 110
3: B 100
4: C 200
过滤缺失值:
dx = read.table(text=" A B C
1 NA 100 NA
2 130 NA NA
3 NA NA 200
4 110 NA NA",header=TRUE,stringsAsFactors=F)