添加具有列名的新列

时间:2018-08-23 12:34:34

标签: r

我有这个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

有什么想法怎么做?

4 个答案:

答案 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的一个选项是whicharr.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)