excel 如何将放在多个列中的数据排序到一个列中?

e5njpo68  于 2022-11-26  发布在  其他
关注(0)|答案(3)|浏览(134)

我在Excel中有一个数据集,其中包含多个列,这些列中包含一组随机分布的特定数据。数据如下所示:

Col1  Col2  Col3  Col4  Col5  Col6
Data  34    NA    NA    NA    NA
NA    NA    Data  32    NA    NA
NA    NA    NA    NA    Data  12
NA    Data  89    NA    NA    NA

我希望将所有Data字段放入一个名为data的列中,因此数据集如下所示(NA列现在并不重要,我有几个字段存在此问题,因此我还需要为其他字段复制解决方案):

Data
34  
32   
12 
89

由于我目前在Excel工作,一个简单的解决方案将是伟大的,但是,我将在某个时候转移到R,所以在R的解决方案也将受到欢迎!
非常感谢,很抱歉给你这么隐晦的描述。
编辑:这里是我的真实的数据的图片-在这个例子中,我想要一个名为“总供应”的列,一个名为“股票行情指数”和一个名为“接受的货币”,各自的数据(在命名的单元格之后)在正确的列中。

输出应如下所示:

yrefmtwq

yrefmtwq1#

如果数据位于名为mat的矩阵中,则以下代码将所需的值提取到一个向量中:

apply(mat, 1L, \(row) row[which(row == 'Data') + 1L])
# [1] "34" "32" "12" "89"

这假设数据的格式正确。任何差异都将产生意外的结果。
也可以在没有apply的情况下使用矢量化函数来执行此操作,但生成的代码稍长:

ind = which(mat == 'Data', arr.ind = TRUE)
ord = order(ind[, 1L])
mat[cbind(seq_along(ord), ind[ord, 2L] + 1L)]
qcbq4gxm

qcbq4gxm2#

试试看:

A6中使用的公式:

=TOCOL(IF(A1:E4="Data",B1:F4,NA()),3)

或者,更动态一点:

=LET(a,A1:F4,TOCOL(IF(DROP(a,,-1)="Data",DROP(a,,1),NA()),3))

**编辑:**根据新信息更新答案;

F2中的公式:

=LET(a,TOCOL(A1:D13,3),IFERROR(DROP(REDUCE(EXPAND(0,,3),SEQUENCE(ROWS(a-1)),LAMBDA(x,y,LET(b,INDEX(a,y+1),c,FILTER(x,NOT(ISERROR(TAKE(x,,1)))),SWITCH(INDEX(a,y),"Ticker",VSTACK(c,b),"Total Supply",VSTACK(DROP(c,-1),HSTACK(TOROW(TAKE(c,-1),3),b)),"Accepted Currencies",VSTACK(DROP(c,-1),HSTACK(TAKE(c,-1,2),b)),c)))),1),""))
pkwftd7m

pkwftd7m3#

使用下面的示例df,您可以执行以下操作:

df[] <- lapply(df, as.character)
df <- data.frame(Data = c(t(df)), stringsAsFactors = FALSE)

subset(df, ave(Data, cumsum(is.na(Data)), FUN = length) > 1L & Data != 'Data')

输出量:

Data
2    34
10   32
18   12
21   89

此方法将捕获值的多次连续出现。(以及如何)捕获在Data之后出现的潜在NA值-这将需要修改(例如,如果Data包含至少一个non-NA,则可以捕获每次出现Data之后出现的所有值,或者可能只是想捕获单个NA,以防之后整个向量为空,但我们仍然有Data,等等)。
数据来源:

df <- read.table(
  text = 'Col1  Col2  Col3  Col4  Col5  Col6
Data  34    NA    NA    NA    NA
NA    NA    Data  32    NA    NA
NA    NA    NA    NA    Data  12
NA    Data  89    NA    NA    NA', header = TRUE
)

相关问题